Json.Net неожиданные символы ("\") при сериализации моих сущностей - PullRequest
22 голосов
/ 19 января 2011

Я использую превосходную библиотеку Json.Net для сериализации моих сущностей, сгенерированных структурой сущностей.Для этого я использую следующий код:

using (MyVoucherEntities context = new MyVoucherEntities())
{
  List<MyObject> list = context.MyObjects.ToList();
  string json = JsonConvert.SerializeObject(list);
}

Все идет хорошо, я имею в виду, что объекты правильно сериализованы, кроме одного взгляда: он добавляет escape-символы "\", что вызывает у меня кошмар при десериализации на клиентеside.

 [
     {
         \"$id\": \"1\",
         \"CreationDate\": \"\\\/Date(1293186324257+0000)\\\/\",
        \"ImageUrl\": \"http:\/\/www.google.com\",
         \"Title\": \"Here is a title\"
     } ]

Кто-нибудь знает, почему и как я могу избавиться от этих escape-символов косой черты "\"?

Ответы [ 5 ]

29 голосов
/ 19 января 2011

Я подозреваю, что это не на самом деле добавление escape-символов вообще.Я подозреваю, что вы просто смотрите на строку в отладчике, и это с добавлением экранирования.

Попробуйте выгрузить ее в файл или консоль.

15 голосов
/ 24 января 2011

Я нашел причину, почему в моей строке были экранирующие символы ("\"). После сериализации моих объектов я возвращаю строку JSON клиентскому приложению через WCF. Очевидно, WCF автоматически добавляет эти символы в строку перед отправкой в ​​сеть. Это поведение по умолчанию и, по-видимому, является обязательным.

Поскольку мне не нужны эти escape-символы, обходной путь состоит в том, чтобы изменить тип возврата службы на Stream и, таким образом, вернуть строку JSON внутри потока памяти. Работает отлично и довольно быстро.

3 голосов
/ 11 ноября 2016

Это недопустимый JSON, потому что результатом сериализации списка объектов является массив, то есть json будет начинаться с [ и заканчиваться ]. Чтобы это исправить, вам нужно обернуть список объектов в корневой объект (любой экземпляр класса или анонимный объект), поэтому результирующая строка будет начинаться с { и заканчиваться }.

Например:

var output = new List<object>();
var json = JsonConvert.SerializeObject(new { root = output }, Formatting.Indented);
Response.Write(json);
1 голос
/ 20 июля 2016

Помогает ли это? Я использовал его в своем WebService для возврата контента Json:

private HttpContent ConvertToJsonContent(object content)
{
  string jsonObject = JsonConvert.SerializeObject(content, Newtonsoft.Json.Formatting.Indented);
  return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}

Если в строках есть "\", два "\\" вернутся. Вы можете избежать этого, используя Unescape

private HttpContent ConvertToJsonContent(object content)
{
  string jsonObject = Regex.Unescape(JsonConvert.SerializeObject(content, Newtonsoft.Json.Formatting.Indented));
  return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
1 голос
/ 19 января 2011

Я должен отметить, что вы не полностью процитировали выводимый материал (я получил URL для работы в вашем ответе - который должен был быть отредактирован в вашем вопросе, а не помещен в качестве ответа).Строка, которую я вернул в файл, была такой:

"[{\"$id\":\"1\",\"CreationDate\":\"\\\/Date(1293186324257+0000)\\\/\",\"ImageUrl\":\"http:\/\/www.c-tina.com\/MyVoucherAdmin\/Images\/shop22\/burger.jpg\",\"Title\":\"Get one burger for free\",\"Description\":\"Bla lbzlfpzkfgmzke\\rdmjdgmj\\r\\r\\rlgfpzkegmkzepk\",\"ShopId\":22,\"PromotionId\":15,\"Shop\":null,\"Features\":[],\"SingleStats\":[],\"WhatsHots\":[],\"EntityKey\":{\"$id\":\"2\",\"EntitySetName\":\"Promotions\",\"EntityContainerName\":\"MyVoucherEntities\",\"EntityKeyValues\":[{\"Key\":\"PromotionId\",\"Type\":\"System.Int32\",\"Value\":\"15\"}]}}]"

Ключевым моментом для меня является то, что в начале и в конце есть неэкранированные кавычки, что заставляет меня думать, что все, что выводится, решает, что нужнобыть заключенным в кавычки, и если вы заключаете его в кавычки, вы должны избегать кавычек, находящихся внутри него.

Не видя полного вывода, трудно сказать, заключается ли проблема в коде, который вы цитировали выше для генерацииJSON или если есть проблема на более позднем этапе обработки этого, которая вызывает цитирование.Отладили ли вы и подтвердили ли вы, что вывод вашего сериализованного вызова определенно создает экранированную версию, а не выполняется на более поздней стадии?Если вы не привыкли к отладчику, обратите внимание на предложение Джона Скита о его выгрузке в файл или консоль, чтобы избежать путаницы.

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