È possibile restituire un oggetto dinamico da una deserializzazione json usando json.net? Vorrei fare qualcosa del genere:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
È possibile restituire un oggetto dinamico da una deserializzazione json usando json.net? Vorrei fare qualcosa del genere:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
Risposte:
Json.NET ci permette 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
Vedi anche JObject.Parse e JArray.Parse
JArray.Parse
.
Dim d As Object = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}")
A partire da Json.NET 4.0 Release 1, esiste il 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<dynamic>());
Assert.That(jsonResponse, Is.TypeOf<JObject>());
}
E, naturalmente, il modo migliore per ottenere la versione corrente è tramite NuGet.
Aggiornato (11/12/2014) per rispondere ai commenti:
Funziona perfettamente. Se si controlla il tipo nel debugger, si vedrà che il valore è, in effetti, dinamico . Il tipo sottostante è a JObject
. Se vuoi controllare il tipo (come specificare ExpandoObject
, quindi fallo.
@Model.Prop
nome in Razor se il tipo restituito è JValue.
JValue
. Ciò mi ha confuso perché stavo lavorando nella finestra del debugger / immediato e non vedevo solo string
s. David lo mostra nello screenshot in basso. Il JValue
è convertibile in modo da poter fare solostring m = jsonResponse.message
Se si deserializza in dinamico, si ottiene indietro un JObject. Puoi ottenere ciò che desideri utilizzando un ExpandoObject.
var converter = new ExpandoObjectConverter();
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
So che questo è un 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 utilizzando JsonConvert.DeserializeObject. Per farlo, fai semplicemente:
dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);
JsonConvert
non contiene un metodo chiamato Deserialize
.
Nota: Al momento in cui ho risposto a questa domanda nel 2010, non c'era modo di deserializzare senza una sorta di tipo, questo ti consentiva di deserializzare senza dover andare a definire la classe effettiva e di utilizzare una classe anonima per fare la deserializzazione.
Devi avere una sorta di tipo a cui deserializzare. Potresti fare qualcosa come:
var product = new { Name = "", Price = 0 };
dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType());
La mia risposta si basa su una soluzione per la build di .NET 4.0 nel serializzatore JSON. Il link per deserializzare i tipi anonimi è qui:
Se usi JSON.NET con una versione precedente che non ha JObject.
Questo è un altro modo semplice per creare un oggetto dinamico da JSON: https://github.com/chsword/jdynamic
Installazione NuGet
PM> Install-Package JDynamic
Supporto per l'utilizzo dell'indice di stringa 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 direttamente il valore
dynamic json = new JDynamic("1");
//json.Value
2. Ottenere il membro nell'oggetto 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.a.a is 1.
Sì, è possibile. L'ho fatto per tutto il tempo.
dynamic Obj = JsonConvert.DeserializeObject(<your json string>);
È un po 'più complicato per il tipo non nativo. Supponiamo che all'interno di Obj ci siano oggetti ClassA e ClassB. Sono tutti convertiti in JObject. Quello che devi fare è:
ClassA ObjA = Obj.ObjA.ToObject<ClassA>();
ClassB ObjB = Obj.ObjB.ToObject<ClassB>();