var Q = new
{
a = W,
b = "Hello, World!",
c = new[] { a, b2, c3 },
d = new Dictionary<string, int> { { "x", c1 }, { "y",c2 } }
};
var jsonstr = JsonConvert.SerializeObject(Q);
第一种做法(匿名类):
var A= new { a = 0, b = String.Empty, c = new int[0], d = new Dictionary<string, int>() };
var W= JsonConvert.DeserializeAnonymousType(jsonstr , A);
Console.WriteLine(W.b);
Console.WriteLine(W.c[1]);
第二种做法(匿名类):
var E= JsonConvert.DeserializeAnonymousType(jsonstr , new { c = new int[0], d = new Dictionary<string, int>() });
Console.WriteLine(E.d["y"]);
DeserializeAnonymousType 只是借助这个匿名对象参数(A) 反射类型而已,也就是说它和反序列化结果并非同一个对象。正如 E那样,我们也可以只提取局部信息。
第三种做法(索引器):
实际上,我们也可以直接反序列化为 JObject,然后通过索引器直接访问。JObject、JProperty 等都继承自 JToken,它重载了基元类型转换操作符,我们可以直接得到实际结果。
var R= JsonConvert.DeserializeObject(jsonstr ) as JObject;
Console.WriteLine((int)R["a"]);
Console.WriteLine((string)R["b"]);
Console.WriteLine(R["c"].Values().Count());
Console.WriteLine((int)R["d"]["y"]);