Json.net kullanarak bir json serileştirmeden dinamik bir nesne döndürmek mümkün mü? Böyle bir şey yapmak istiyorum:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
Json.net kullanarak bir json serileştirmeden dinamik bir nesne döndürmek mümkün mü? Böyle bir şey yapmak istiyorum:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
Yanıtlar:
Json.NET bunu yapmamıza izin verir:
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);
Çıktı:
1000
string
6
Buradaki belgeler: Json.NET ile LINQ to JSON
Ayrıca bkz. JObject.Parse ve 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 Sürüm 1'den itibaren yerel dinamik destek vardır:
[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>());
}
Ve elbette, mevcut sürümü almanın en iyi yolu NuGet.
Yorumları ele almak için güncellendi (11/12/2014):
Bu mükemmel çalışıyor. Hata ayıklayıcıdaki türü incelerseniz, değerin aslında dinamik olduğunu görürsünüz . Temel tipi a, JObject
. Türü kontrol etmek istiyorsanız (belirtmek gibi) ExpandoObject
.
@Model.Prop
dönüş tipi JValue ise Razor adı.
JValue
. Hangi hata ayıklayıcı / anında penceresinde çalışıyordu ve sadece string
s görmüyordu çünkü beni şaşırttı . David bunu alt ekran görüntüsünde gösterir. JValue
Sadece bunu yapabilirsiniz dönüştürülebilenstring m = jsonResponse.message
Sadece dinamiğe serileştirirseniz, bir JObject geri alırsınız. Bir ExpandoObject kullanarak istediğinizi elde edebilirsiniz.
var converter = new ExpandoObjectConverter();
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
Bu eski yazı olduğunu biliyorum ama JsonConvert aslında farklı bir yöntemi vardır, bu yüzden olurdu
var product = new { Name = "", Price = 0 };
var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);
Evet JsonConvert.DeserializeObject kullanarak yapabilirsiniz. Bunu yapmak için, basitçe yapın:
dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);
JsonConvert
adlı bir yöntem içermiyor Deserialize
.
Not: 2010'da bu soruyu cevapladığım sırada, bir tür türü olmadan serileştirmenin bir yolu yoktu, bu, gerçek sınıfı tanımlamak zorunda kalmadan serileştirmenize izin verdi ve serileştirmeyi yapmak için anonim bir sınıfın kullanılmasına izin verdi.
Diziden serileştirmek için bir tür türünüz olması gerekir. Aşağıdakiler boyunca bir şeyler yapabilirsiniz:
var product = new { Name = "", Price = 0 };
dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType());
Cevabım, .NET 4.0'ın JSON serileştiricisindeki derlemesi için bir çözüme dayanıyor. Anonim türlerin serileştirilmesi için bağlantı burada:
JObject olmayan eski sürümü ile JSON.NET kullanıyorsanız.
Bu, JSON'dan dinamik bir nesne oluşturmanın başka bir basit yoludur: https://github.com/chsword/jdynamic
NuGet Kurulumu
PM> Install-Package JDynamic
Üye gibi erişmek için dize dizini kullanarak destek:
dynamic json = new JDynamic("{a:{a:1}}");
Assert.AreEqual(1, json["a"]["a"]);
Test durumu
Ve bu programı aşağıdaki gibi kullanabilirsiniz:
Değeri doğrudan alın
dynamic json = new JDynamic("1");
//json.Value
2.Json nesnesindeki üyeyi alın
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.
Diğer
dynamic json = new JDynamic("{a:{a:1} }");
//json.a.a is 1.
Evet mümkün. Bunu her zaman yapıyorum.
dynamic Obj = JsonConvert.DeserializeObject(<your json string>);
Doğal olmayan tip için biraz daha zor. Obj'nizin içinde bir ClassA ve ClassB nesneleri olduğunu varsayalım. Hepsi JObject'e dönüştürülür. Yapmanız gereken:
ClassA ObjA = Obj.ObjA.ToObject<ClassA>();
ClassB ObjB = Obj.ObjB.ToObject<ClassB>();