Json.NET: десерилизация с двойными кавычками - PullRequest
4 голосов
/ 13 ноября 2011

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

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

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

Ответы [ 5 ]

10 голосов
/ 08 февраля 2013

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

HttpUtility.JavaScriptStringEncode(JsonConvert.SerializeObject(yourObject))
2 голосов
/ 23 января 2014

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

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

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

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

Приветствия

1 голос
/ 22 марта 2019

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

    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);
1 голос
/ 25 октября 2018

У меня была такая же проблема, и я нашел возможное решение. Идея состоит в том, чтобы поймать исключение 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);
            }               
        }

Надеюсь, вам понравится.

0 голосов
/ 13 ноября 2011

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

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

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