Удалить дескриптор объекта json в динамический объект с помощью Json.net

Можно ли вернуть динамический объект из десериализации json с помощью json.net? Я хотел бы сделать что-то вроде этого:

dynamic jsonResponse = JsonConvert.Deserialize(json); Console.WriteLine(jsonResponse.message); 

последняя версия json.net позволяет сделать это:

 dynamic d = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}"); Console.WriteLine(d.number); Console.WriteLine(d.str); Console.WriteLine(d.array.Count); 

вывод:

  1000 string 6 

Документация здесь: LINQ to JSON с Json.NET

Начиная с версии Json.NET 4.0 Release 1 существует встроенная динамическая поддержка:

 [Test] public void DynamicDeserialization() { dynamic jsonResponse = JsonConvert.DeserializeObject("{\"message\":\"Hi\"}"); jsonResponse.Works = true; Console.WriteLine(jsonResponse.message); // Hi Console.WriteLine(jsonResponse.Works); // True Console.WriteLine(JsonConvert.SerializeObject(jsonResponse)); // {"message":"Hi","Works":true} Assert.That(jsonResponse, Is.InstanceOf()); Assert.That(jsonResponse, Is.TypeOf()); } 

И, конечно, лучший способ получить текущую версию – через NuGet.

Обновлено (11/12/2014) для комментариев:

Это прекрасно работает. Если вы проверите тип в отладчике, вы увидите, что это действительно динамическое значение . Основной тип – это JObject . Если вы хотите управлять типом (например, указав ExpandoObject , сделайте это.

введите описание изображения здесь

Если вы просто deserialize для динамического, вы получите JObject обратно. Вы можете получить то, что хотите, с помощью ExpandoObject.

 var converter = new ExpandoObjectConverter(); dynamic message = JsonConvert.DeserializeObject(jsonString, converter); 

Я знаю, что это старый пост, но у JsonConvert есть другой метод, поэтому

 var product = new { Name = "", Price = 0 }; var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product); 

Да, вы можете сделать это, используя JsonConvert.DeserializeObject. Для этого просто выполните:

 dynamic jsonResponse = JsonConvert.DeserializeObject(json); Console.WriteLine(jsonResponse["message"]); 

Примечание. В то время, когда я ответил на этот вопрос в 2010 году, не было никакого способа десериализации без какого-либо типа, это позволило вам десериализоваться, не указав фактический class и разрешив использовать анонимный class для выполнения десериализации.


Для десериализации нужно иметь какой-то тип. Вы могли бы сделать что-то вроде:

 var product = new { Name = "", Price = 0 }; dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType()); 

Мой ответ основан на решении для сборки .NET 4.0 в JSON-сериализаторе. Ссылка на десериализацию анонимных типов находится здесь:

http://blogs.msdn.com/b/alexghi/archive/2008/12/22/using-anonymous-types-to-deserialize-json-data.aspx

Если вы используете JSON.NET со старой версией, которая не JObject.

Это еще один простой способ сделать динамический объект из JSON: https://github.com/chsword/jdynamic

Установка NuGet

 PM> Install-Package JDynamic 

Поддержка использования индекса строки для доступа к элементу типа:

 dynamic json = new JDynamic("{a:{a:1}}"); Assert.AreEqual(1, json["a"]["a"]); 

Прецедент

И вы можете использовать эту утилиту следующим образом:

Получить значение напрямую

 dynamic json = new JDynamic("1"); //json.Value 

2. Получить член в объекте json

 dynamic json = new JDynamic("{a:'abc'}"); //json.a is a string "abc" dynamic json = new JDynamic("{a:3.1416}"); //json.a is 3.1416m dynamic json = new JDynamic("{a:1}"); //json.a is integer: 1 

3.IEnumerable

 dynamic json = new JDynamic("[1,2,3]"); /json.Length/json.Count is 3 //And you can use json[0]/ json[2] to get the elements dynamic json = new JDynamic("{a:[1,2,3]}"); //json.a.Length /json.a.Count is 3. //And you can use json.a[0]/ json.a[2] to get the elements dynamic json = new JDynamic("[{b:1},{c:1}]"); //json.Length/json.Count is 2. //And you can use the json[0].b/json[1].c to get the num. 

Другие

 dynamic json = new JDynamic("{a:{a:1} }"); //json.aa is 1. 

Да, это возможно. Я все это время делаю.

 dynamic Obj = JsonConvert.DeserializeObject(); 

Это немного сложнее для не-родного типа. Предположим, что внутри вашего объекта Obj есть объекты ClassA и ClassB. Все они преобразованы в JObject. Что вам нужно сделать:

 ClassA ObjA = Obj.ObjA.ToObject(); ClassB ObjB = Obj.ObjB.ToObject(); 
  • Удаление десериализации JSON в .NET-объект с использованием Newtonsoft (или LINQ to JSON, возможно?)
  • Можете ли вы определить, был ли объект, десериализованный объект, отсутствием поля с classом JsonConvert в Json.NET
  • Как показать «вставить class Json» в visual studio 2012, нажав на «Специальная вставка»?
  • Установка стандартного JSON-сериализатора в ASP.NET MVC
  • Заставить JSON.NET включать миллисекунды при сериализации DateTime (даже если компонент ms равен нулю)
  • JSON.NET как сериализатор OAP для WebAPI 2 и ODataMediaTypeFormatter
  • JSON.Net Обнаружен собственный цикл привязки
  • Json.Net: Html Помощник не регенерирует
  • Использование пользовательской десериализации тела WCF без изменения десериализации шаблона URI
  • Дезаминирование гетерогенного массива JSON в ковариантный список с использованием JSON.NET
  • ТипNameHandling предостережение в Newtonsoft Json
  • Interesting Posts

    Как я могу прочитать внутреннее создание / изменение PDF в Windows PowerShell?

    Как вы скрываете Finder из списка приложений, когда Command-Tabbing?

    Что такое регулярное выражение для извлечения всех emojis из строки?

    Скажите CMake, чтобы использовать компилятор C ++ для файлов C, поступающих из CMake?

    Ручная установка 64-разрядных драйверов ODBC для доступа к MS Access при наличии 32-разрядного Office

    Получить имя пользователя Windows с помощью JAVA или JSP

    Заставить браузер загружать «https» версию веб-сайта, а не «http»?

    Как заставить Debian использовать размер физического сектора на жестком диске?

    objective ThreadLocal?

    Диагностика ошибок 404 в IIS 7 и ASP.NET MVC

    Различия между страtagsями GeneratedValue

    Не совместимый модуль RAM

    Создание и управление приложениями Facebook из бизнес-аккаунта

    Показывать элементы управления, добавленные программно в приложении WinForms в представлении «Дизайн»?

    Требуется версия Gradle 2.2. Текущая версия 2.10

    Давайте будем гением компьютера.