Отладка JSON.NET - PullRequest
       18

Отладка JSON.NET

9 голосов
/ 19 октября 2011

Я использую JSON.NET для десериализации некоторого JSON, возвращенного из веб-службы.К сожалению, я получаю следующую ошибку:

Невозможно десериализовать массив JSON в тип 'System.Collections.Generic.Dictionary`2 [System.String, System.String]'.

но я понятия не имею, как его отладить.Есть ли способ, чтобы он сказал мне, что такое оскорбительный JSON?или даже к чему это пытается десериализовать?к сожалению, это часть большей иерархии объектов, так что это не просто кусок JSON.Я пытался пройтись по коду, но есть много миль и мало документации.Если бы он мог хотя бы рассказать мне об оскорбительной части, тогда я мог бы увидеть, если я, возможно, поднял мое определение объекта или что-то в этом роде.

Ответы [ 3 ]

21 голосов
/ 03 декабря 2012

Если вы хотите десериализовать то, что вы конвертируете из json в классы C #, для этого есть что-то встроенное в json.net. Просто создайте объект настроек и передайте его в свой вызов десериализации объекта:

if (!string.IsNullOrEmpty(json))
{
   var settings = new JsonSerializerSettings
       {
           Error = (sender, args) =>
                   {
                       if (System.Diagnostics.Debugger.IsAttached)
                       {
                            System.Diagnostics.Debugger.Break();
                       }
                   }
       };

    result = JsonConvert.DeserializeObject<T>(json, settings);
}

Тогда, когда в процессе десериализации будут возникать ошибки (например, неправильно сопоставленный класс C # -> объект json), он будет прерываться в отладчике. Осмотрите объект args, и вы увидите свойство с именем CurrentObject. Это класс C #, в который анализатор пытается десериализовать JSON (и предоставит подробную информацию о том, в чем может быть ошибка).

Надеюсь, это поможет.

3 голосов
/ 19 октября 2011

Выяснил, где искать после прохождения тонны кода. строка 1118ish JsonSerializerInternalReader имеет вид:

          SetPropertyValue(property, reader, newObject);

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

Было бы полезно, однако, если бы JSON.net поднял хотя бы имя свойства в ошибке, но пока это не произойдет, это будет следующим лучшим решением.

0 голосов
/ 19 октября 2011

Исходя из предоставленной вами информации, я бы начал с поиска объекта со свойством типа Dictionary. Это, вероятно, ваш класс проблемы.

...