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");
}