是否有可能从json反序列化使用json.net返回一个动态对象?我想这样做:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
是否有可能从json反序列化使用json.net返回一个动态对象?我想这样做:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
注意:当我在2010年回答这个问题时,没有某种类型就无法反序列化,这允许你在不定义实际类的情况下进行反序列化,并允许使用匿名类来进行反序列化。
你需要有某种类型来反序列化。你可以这样做:
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
我知道这是旧的帖子,但JsonConvert实际上有一个不同的方法,所以它会
var product = new { Name = "", Price = 0 };
var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);
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 to JSON with JSON。网
参见JObject。解析和JArray。解析
从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。
更新(11/12/2014)以解决意见:
这工作得非常好。如果您在调试器中检查该类型,您将看到该值实际上是动态的。底层类型是一个JObject。如果你想控制类型(比如指定ExpandoObject),那么就这样做。
是的,你可以使用JsonConvert.DeserializeObject。要做到这一点,只需简单地做:
dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);
如果你反序列化为动态,你会得到一个JObject。你可以通过使用ExpandoObject得到你想要的东西。
var converter = new ExpandoObjectConverter();
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
如果使用JSON。NET的旧版本没有JObject。
这是另一种从JSON中创建动态对象的简单方法: https://github.com/chsword/jdynamic
NuGet 安装
PM> Install-Package JDynamic
支持使用字符串索引访问成员,如:
dynamic json = new JDynamic("{a:{a:1}}");
Assert.AreEqual(1, json["a"]["a"]);
测试用例
你可以像下面这样使用这个util:
直接获取值
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.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.
其他
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>();