Deserializzare l’object json in object dinamico usando Json.net

È ansible restituire un object dinamico da una deserializzazione JSON usando json.net? Mi piacerebbe fare qualcosa di simile a questo:

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

l’ultima versione di json.net consente di fare questo:

 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); 

produzione:

  1000 string 6 

Documentazione qui: LINQ to JSON con Json.NET

A partire da JSON.NET 4.0 Release 1, esiste un supporto dinamico nativo:

 [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()); } 

E, naturalmente, il modo migliore per ottenere la versione corrente è tramite NuGet.

Aggiornato (11/12/2014) per indirizzare commenti:

Funziona perfettamente. Se controlli il tipo nel debugger vedrai che il valore è, infatti, dinamico . Il tipo sottostante è un JObject . Se vuoi controllare il tipo (ad esempio specificando ExpandoObject , allora fallo.

inserisci la descrizione dell'immagine qui

Se si deserializza in dinamico, si ottiene un JObject. Puoi ottenere ciò che vuoi usando ExpandoObject.

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

So che questo è vecchio post ma JsonConvert ha in realtà un metodo diverso, quindi sarebbe

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

Sì, puoi farlo usando JsonConvert.DeserializeObject. Per farlo, basta fare semplicemente:

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

Nota: nel momento in cui ho risposto a questa domanda nel 2010, non c’era modo di deserializzare senza un tipo di tipo, questo ha permesso di deserializzare senza andare a definire la class effettiva e consentito a una class anonima di essere utilizzata per effettuare la deserializzazione.


È necessario disporre di un tipo di tipo per deserializzare. Potresti fare qualcosa sulla falsariga di:

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

La mia risposta è basata su una soluzione per il build di .NET 4.0 in serializzatore JSON. Link per deserializzare in tipi anonimi è qui:

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

Se si utilizza JSON.NET con la versione precedente che non era JObject.

Questo è un altro modo semplice per creare un object dinamico da JSON: https://github.com/chsword/jdynamic

Installazione NuGet

 PM> Install-Package JDynamic 

Supporta l’utilizzo dell’indice di stringhe per accedere a membri come:

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

Test Case

E puoi usare questo util come segue:

Ottieni il valore direttamente

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

2. Ottenere il membro nell’object 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. 

Altro

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

Sì, è ansible. L’ho fatto per tutto il tempo.

 dynamic Obj = JsonConvert.DeserializeObject(); 

È un po ‘più complicato per il tipo non nativo. Supponiamo che all’interno del tuo Obj ci siano oggetti ClassA e ClassB. Sono tutti convertiti in JObject. Quello che devi fare è:

 ClassA ObjA = Obj.ObjA.ToObject(); ClassB ObjB = Obj.ObjB.ToObject();