Чи можливо повернути динамічний об’єкт з деріаріалізації json за допомогою json.net? Я хотів би зробити щось подібне:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
Чи можливо повернути динамічний об’єкт з деріаріалізації 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 до JSON з Json.NET
Дивіться також JObject.Parse та JArray.Parse
JArray.Parse
.
Dim d As Object = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}")
Станом на Json.NET 4.0, випуск 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<dynamic>());
Assert.That(jsonResponse, Is.TypeOf<JObject>());
}
І, звичайно, найкращий спосіб отримати поточну версію - через NuGet.
Оновлено (12.12.2014) для вирішення коментарів:
Це прекрасно працює. Якщо ви оглянете тип у відладчику, то побачите, що значення насправді є динамічним . Базового типу є JObject
. Якщо ви хочете керувати типом (наприклад, вказати ExpandoObject
, то зробіть це.
@Model.Prop
ім'я в Razor, якщо тип повернення - JValue.
JValue
. Що мене бентежило, бо я працював у відладці / безпосередньому вікні і не бачив просто string
s. Девід показує це на нижньому екрані екрана. JValue
Конвертується , так що ви можете просто зробитиstring m = jsonResponse.message
Якщо ви просто деаріалізуєтеся на динамічну, ви отримаєте JObject назад. Ви можете отримати те, що хочете, використовуючи ExpandoObject.
var converter = new ExpandoObjectConverter();
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(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"]);
JsonConvert
не містить методу, який називається Deserialize
.
Примітка: У той час, коли я відповідав на це запитання в 2010 році, не було можливості десеріалізувати без якогось типу, це дозволило вам десеріалізувати, не визначаючи фактичний клас, і дозволило використовувати анонімний клас для десеріалізації.
Потрібно мати якийсь тип, щоб десеріалізувати. Ви можете зробити щось відповідно до:
var product = new { Name = "", Price = 0 };
dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType());
Моя відповідь ґрунтується на рішенні для побудови .NET 4.0 у серіалізаторі JSON. Посилання на десеріалізацію до анонімних типів знаходиться тут:
Якщо ви використовуєте JSON.NET зі старою версією, яка не JObject.
Це ще один простий спосіб зробити динамічний об’єкт з JSON: https://github.com/chsword/jdynamic
NuGet Install
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.Незліченна
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.a.a is 1.
Так, це можливо. Я це робив увесь час.
dynamic Obj = JsonConvert.DeserializeObject(<your json string>);
Це трохи складніше для не рідного типу. Припустимо, всередині вашого Obj є об'єкти ClassA та ClassB. Усі вони перетворюються на JObject. Що вам потрібно зробити:
ClassA ObjA = Obj.ObjA.ToObject<ClassA>();
ClassB ObjB = Obj.ObjB.ToObject<ClassB>();