Json.NET: десерилизация с помощью двойных кавычек

Я пытаюсь десериализовать строку json, полученную в качестве ответа от службы. Клиент - Windows Phone 7, на C#. Я использую десериализатор Json .NET — James Newton-King для прямого преобразования Json строка к объектам. Но иногда строка Json содержит некоторую информацию комментариев с двойными кавычками ("), и десериализатор дает сбой и выдает ошибку. Похоже, что это недопустимая строка Json в соответствии с Jsonlint.

{
    "Name": "A1",
    "Description": "description of the "object" A1"
}

Как обращаться с такой Json String. Если это (\"), то это работает. Но я не могу заменить все (") на (\"), так как в другой части строки json могут быть двойные кавычки. Есть ли функция декодирования Json .Net?


person franklins    schedule 13.11.2011    source источник
comment
попробуйте использовать пользовательскую десериализацию, этот пост в SO может вам помочь [Как преобразовать объект json в пользовательский тип перед десериализацией?] [1] [1]: stackoverflow.com/questions/6975789/   -  person DeveloperX    schedule 13.11.2011


Ответы (6)


Похоже, HttpUtility.JavaScriptStringEncode может решить вашу проблему.

HttpUtility.JavaScriptStringEncode(JsonConvert.SerializeObject(yourObject))
person ITmeze    schedule 08.02.2013

Просто сделать:

yourJsonString = yourJsonString.Replace("\"", "\\u022");
object o = JSonConvert.Deserialize(yourJsonString);

\u022 — это код ascii для двойных кавычек. Таким образом, замена кавычек на \u022 будет распознана вашим браузером.

И используйте \ в "\ u022", чтобы С# распознал символ обратной косой черты.

Ваше здоровье

person Alexandre TRINDADE    schedule 22.01.2014

Вы можете улучшить это.

    static private T CleanJson<T>(string jsonData)
    {
        var json = jsonData.Replace("\t", "").Replace("\r\n", "");
        var loop = true;
        do
        {
            try
            {
                var m = JsonConvert.DeserializeObject<T>(json);
                loop = false;
            }
            catch (JsonReaderException ex)
            {
                var position = ex.LinePosition;
                var invalidChar = json.Substring(position - 2, 2);
                invalidChar = invalidChar.Replace("\"", "'");
                json = $"{json.Substring(0, position -1)}{invalidChar}{json.Substring(position)}";
            }
        } while (loop);
        return JsonConvert.DeserializeObject<T>(json);
    }

Пример;

var item = CleanJson<ModelItem>(jsonString);
person dcansyn    schedule 22.03.2019
comment
Очень красивое решение. Это следует считать правильным ответом. - person sina_Islam; 15.07.2019

У меня была такая же проблема, и я нашел возможное решение. Идея состоит в том, чтобы поймать JsonReaderException. Это исключение приносит вам атрибут "LinePosition". Вы можете заменить эту позицию на пустой символ (' '). И затем вы используете этот метод рекурсивно, пока весь json не будет исправлен. Это мой пример:

private JToken processJsonString(string data, int failPosition)
        {
            string json = "";
            var doubleQuote = "\"";

            try
            {
                var jsonChars = data.ToCharArray();

                if (jsonChars[failPosition - 1].ToString().Equals(doubleQuote))
                {
                    jsonChars[failPosition - 1] = ' ';
                }

                json = new string(jsonChars);

                return JToken.Parse(json);
            }
            catch(JsonReaderException jsonException)
            {
                return this.processJsonString(json, jsonException.LinePosition);
            }               
        }

Я надеюсь, тебе это нравится.

person Raúl Adrián Mene    schedule 25.10.2018

Я бы порекомендовал написать письмо администратору/веб-мастеру сервера и попросить их решить эту проблему с помощью json.

Но если это невозможно, вы можете написать простой синтаксический анализ, который находит не экранированные двойные кавычки внутри двойных кавычек и экранирует их. Вряд ли это будет> 20 строк кода.

person Grigory    schedule 13.11.2011
comment
Привет, не могли бы вы помочь с вашим предложением? Вы говорите о регулярном выражении? - person franklins; 25.08.2012
comment
Написание этих строк будет высоко оценено многими людьми. - person krillgar; 24.03.2015

вы можете использовать библиотеку newtonsoft, чтобы преобразовать ее в объект (заменить \" на "):

dynamic o = JObject.Parse(jsondata);
return Json(o);
person Ali Rasouli    schedule 21.07.2019