Json.Net неожиданные символы ( "\" ) при сериализации моих объектов (Entity framework)

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

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

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

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

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

Ответы

Ответ 1

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

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

спасибо @Jon Skeet и @Chris за вашу помощь!

Ответ 2

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

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

Ответ 3

Недействительный JSON, потому что результатом сериализации списка объектов является массив, т.е. json начнет с символа '[' и заканчивается на ']'. Чтобы исправить это, вам нужно обернуть список объектов в корневом объекте (любой экземпляр класса или анонимного объекта), поэтому результирующая строка начнется с "{" и заканчивается на "}". Например: var output = new List<object>(); var json = JsonConvert.SerializeObject(new { root = output }, Formatting.Indented); Response.Write(json);

Ответ 4

Я должен отметить, что вы не полностью цитировали выведенный материал (я получил 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 или если на более позднем этапе обработки возникает проблема, вызывающая цитирование. Вы отлаживали и подтвердили, что вывод вашего вызова сериализации определенно создает экранированную версию, а не на поздней стадии? Если вы не привыкли к отладчику, обратите внимание на то, что Jon Skeet предлагает сбросить его в файл или консоль, чтобы убедиться, что это не путается.

Ответ 5

Помогает ли это? Я использовал его в своем 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");
}