Deserialize json object into dynamic object using Json.net
是否可以使用json.net从JSON反序列化返回动态对象?我想这样做:
1 2 | dynamic jsonResponse = JsonConvert.Deserialize(json); Console.WriteLine(jsonResponse.message); |
最新的json.net版本允许这样做:
1 2 3 4 5 | 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); |
输出:
1 2 3 | 1000 string 6 |
。
这里的文档:linq to json with json.net
从JSON.NET 4.0版本1开始,有本机动态支持:
1 2 3 4 5 6 7 8 9 10 11 | [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。
更新(2014年11月12日)以处理意见:
这很好用。如果检查调试器中的类型,您将看到该值实际上是动态的。基础类型是
。
如果您只是反序列化为动态的,那么您将得到一个jobject。您可以使用Expandoobject获得所需的内容。
1 2 | var converter = new ExpandoObjectConverter(); dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter); |
。
我知道这是老文章,但jsonconvert实际上有不同的方法,所以
1 2 | var product = new { Name ="", Price = 0 }; var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product); |
号
是的,您可以使用jsonConvert.DeserializeObject来完成。要做到这一点,只需简单地做到:
1 2 | dynamic jsonResponse = JsonConvert.DeserializeObject(json); Console.WriteLine(jsonResponse["message"]); |
。
注意:在2010年我回答这个问题时,没有某种类型的反序列化方法,这允许您在不定义实际类的情况下反序列化,并允许使用匿名类进行反序列化。
您需要有某种类型来反序列化。你可以做一些事情:
1 2 | 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安装
1 | PM> Install-Package JDynamic |
支持使用字符串索引访问成员,如:
1 2 |
。
测试用例
您可以使用以下实用程序:
直接获取值
1 2 3 |
2.获取json对象中的成员
1 2 3 4 5 6 7 8 |
。
3.IEnumerable公司
1 2 3 4 5 6 7 8 9 10 11 | 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. |
号
其他
1 2 3 |
号
是的,这是可能的。我一直在这样做。
1 | dynamic Obj = JsonConvert.DeserializeObject(<your json string>); |
号
对于非本地类型来说,这有点棘手。假设在obj中有一个classa和classb对象。它们都转换为Jobject。你需要做的是:
1 2 | ClassA ObjA = Obj.ObjA.ToObject<ClassA>(); ClassB ObjB = Obj.ObjB.ToObject<ClassB>(); |
号