Возврат необработанного json (строки) в wcf - PullRequest
47 голосов
/ 20 июня 2010

Я хочу построить свой собственный JSON, и чтобы служба возвращала строку, вот код

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
public string GetCurrentCart()
{
    //Code ommited
    string jsonClient = null;
    var j = new { Content = response.Content, Display=response.Display, SubTotal=response.SubTotal};
    var s = new JavaScriptSerializer();
    jsonClient = s.Serialize(j);
    return jsonClient;
}

Ответ, который я получаю, содержит \ "используемые для создания" строки в c #.

Ниже приводится ответ.

"{\"Content\":\"\\r\\n\\u003cdiv\\u003e\\r\\n\\u003cinput type=\\\"hidden\\\" name=\\\"__VIEWSTATE\\\" id=\\\"__VIEWSTATE\\\" value=\\\"\/wEPDwUBMA9kFgJmD2QWAmYPZBYGAgMPFgIeBFRleHQFKFlvdSBoYXZlIG5vIGl0ZW1zIGluIHlvdXIgc2hvcHBpbmcgY2FydC5kAgUPFgIeB1Zpc2libGVoZAIHDxQrAAIPFgIfAWhkZGQYAQUMY3RsMDEkbHZDYXJ0D2dkoWijqBUJaUxmDgFrkGdWUM0mLpgQmTOe8R8hc8bZco4=\\\" \/\\u003e\\r\\n\\u003c\/div\\u003e\\r\\n\\r\\n\\u003cdiv class=\\\"block block-shoppingcart\\\"\\u003e\\r\\n    \\u003cdiv class=\\\"title\\\"\\u003e\\r\\n        \\u003cspan\\u003eShopping Cart\\u003c\/span\\u003e\\r\\n    \\u003c\/div\\u003e\\r\\n    \\u003cdiv class=\\\"clear\\\"\\u003e\\r\\n    \\u003c\/div\\u003e\\r\\n    \\u003cdiv class=\\\"listbox\\\"\\u003e\\r\\n        You have no items in your shopping cart.\\r\\n        \\r\\n        \\r\\n    \\u003c\/div\\u003e\\r\\n\\u003c\/div\\u003e\\r\\n\",\"Display\":\"You have no items in your shopping cart.\",\"SubTotal\":null}"

Значения корректно кодируются, но сам json не отформатирован должным образом. Это заставляет его выходить из строя.

Как мне вернуть строку без "\" перед "?"

Ответы [ 4 ]

108 голосов
/ 20 июня 2010

В настоящее время ваш веб-метод возвращает String вместе с ResponseFormat = WebMessageFormat.Json. Это соответствует JSON-кодировке строки. Соответствует www.json.org, все двойные кавычки в строке будут экранированы с помощью обратной косой черты. Итак, у вас есть двойная кодировка JSON.

Самый простой способ вернуть любой тип данных - это изменить тип вывода веб-метода GetCurrentCart() на Stream или MessageSystem.ServiceModel.Channels) вместо String.
См. http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-web.aspx, http://msdn.microsoft.com/en-us/library/ms789010.aspx и http://msdn.microsoft.com/en-us/library/cc681221(VS.90).aspx для примеров кода.

Поскольку вы не указали в своем вопросе, какую версию .NET вы используете, я предлагаю вам использовать универсальный и самый простой способ:

public Stream GetCurrentCart()
{
    //Code ommited
    var j = new { Content = response.Content, Display=response.Display,
                  SubTotal=response.SubTotal};
    var s = new JavaScriptSerializer();
    string jsonClient = s.Serialize(j);
    WebOperationContext.Current.OutgoingResponse.ContentType =
        "application/json; charset=utf-8";
    return new MemoryStream(Encoding.UTF8.GetBytes(jsonClient));
}
5 голосов
/ 22 февраля 2012

Я попробовал метод, предложенный Олегом, но обнаружил, что когда я использовал этот метод для большого объема данных, в конце строки JSON добавлялось пустое ключевое слово.

Пример: для JSON с большим количеством данных { "JsonExample": "ххххх"} нуль

нашел решение для решения этой проблемы по адресу: http://wcf.codeplex.com/workitem/67 Написал следующую функцию, которая будет принимать объект и возвращать вывод Pure Json. Поэтому, прежде чем вернуть свой объект в метод main, я вызову метод ниже.

  public HttpResponseMessage ReturnPureJson(object responseModel)
    {
        HttpResponseMessage response = new HttpResponseMessage();

        string jsonClient = Json.Encode(responseModel);
        byte[] resultBytes = Encoding.UTF8.GetBytes(jsonClient);
        response.Content = new StreamContent(new MemoryStream(resultBytes));
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/plain");

        return response;
    }
2 голосов
/ 23 сентября 2015

Я рекомендую использовать библиотеку Jil для сериализации вашего объекта JSON или динамического (ExpandoObject).

В моем случае это позволит избежать некоторой проблемы с нулевым значением, например всегда получать «{}» из JsonConvert.SerializeXXX и расширять {aa: bb} до {key: aa, значение: bb} из JavaScriptSerializer

полный образец здесь, как показано ниже.

Интерфейс:

[OperationContract]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "json/GetCurrentCart")]
Stream GetCurrentCart(MyRequestParam Param);

Реализация:

public Stream GetCurrentCart(MyRequestParam Param)
{
    //code omitted
    dynamic j = new System.Dynamic.ExpandoObject();
    j.Content = response.Content;
    j.Display = response.Display; 
    j.SubTotal = response.SubTotal;
    string s = Jil.JSON.SerializeDynamic(j);
    WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
    return new MemoryStream(Encoding.UTF8.GetBytes(s));
} 
2 голосов
/ 12 февраля 2015

Это было здорово ( Олег Ответ), и все убедитесь, что вы добавили строку WebOperationContext.Current.OutgoingResponse.ContentType = "application / json; charset = utf-8";

если вы удалили его, результат будет загружен в виде файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...