Подтвердить что ты не робот

Newtonsoft JSON - Динамические объекты

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

Отправной точкой является следующая строка JSON:

{
  "task": {
    "dueDate": "2012-12-03T00:00:00"
  }
}

Здесь нет ничего сложного...

В коде я делаю следующее:

var dyn = JsonConvert.DeserializeObject<dynamic>(rawJson);
DateTime dueDate = dyn.task.dueDate.Value;

Этот код существует уже несколько месяцев и отлично работает, однако в недавней тестовой сборке мы обнаружили следующую ошибку:

'Newtonsoft.Json.Linq.JObject' не содержит определения для 'task'

Трассировка стека: в CallSite.Target(Closure, CallSite, Object) в System.Dynamic.UpdateDelegates.UpdateAndExecute1 [Т0, Tret] (CallSite сайт, T0 arg0)

Теперь это где странно, все начинает работать снова, если я изменил код выше:

DateTime dueDate = dyn.task.dueDate.Value;

к

DateTime dueDate = dyn["task"]["dueDate"].Value;

Итак, хотя это "исправлено", я не понимаю, почему это исправление и какова возможная причина. Кто-нибудь есть идеи

4b9b3361

Ответ 2

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

Было бы неплохо узнать, почему это происходит для некоторого контента, десериализованного Json.NET, но не для всего контента. Например, у меня есть динамический объект я serialize с json.net в unit test, а затем десериализуйте сериализованный контент. Сериализованный контент выглядит идентично содержимому, которое во время выполнения вызывает исключение связующего времени выполнения.

Ответ 3

У меня была та же проблема.

Json.NET 6.0.4 вызывает эту проблему. Вы должны изменить его на Json.Net 6.0.5. Ни один из проектов не должен ссылаться на Json.NET 6.0.4.

Перейдите в Инструменты → Диспетчер пакетов NuGet → Управление пакетами NuGet для решения... и проверьте, если какой-либо из проектов использует Json.NET 6.0.4, исправьте их.

Ответ 4

Это определенно проблема, связанная с ссылкой, у меня была такая же проблема, оказалось, что проблема заключалась в том, что я добавил папку пакетов в проект, чтобы я мог проверить ее на VSS (извините, обязательно), как только Я удалил папку пакетов из visual studio, она начала нормально работать

Ответ 5

У меня была такая же проблема с приложением, использующим Json.NET. Проблема повторялась только на одной конкретной машине, и оказалось, что у машины была другая версия Json.NET, установленная в GAC. После удаления из GAC приложение начало работать правильно.

Ответ 6

У меня эта проблема продолжалась некоторое время, получается, что используемая DLL была скомпилирована для .NET 3.5, которая не поддерживала динамический.... Убедитесь, что ваша DLL скомпилирована для .NET 4.5 и выше