反序列化JSON – 如何忽略根元素?

我正在使用一个WCF服务,该服务返回包含在’d’根元素内的JSON结果。 JSON响应如下所示:

{"d":[ { "__type":"DiskSpaceInfo:#Diagnostics.Common", "AvailableSpace":38076567552, "Drive":"C:\\", "TotalSpace":134789197824 }, { "__type":"DiskSpaceInfo:#Diagnostics.Common", "AvailableSpace":166942183424, "Drive":"D:\\", "TotalSpace":185149157376 } ]} 

我不想使用动态类型,我有我的类Diagnostics.Common.DiskSpaceInfo,我想在反序列化时使用。

我正在使用Json.NET(Netwonsoft JSON)。

问题是如何告诉它忽略根元素(即’d’元素)并解析其中的内容。

我到目前为止最好的解决方案是使用匿名类型:

 DiskSpaceInfo[] result = JsonConvert.DeserializeAnonymousType(json, new { d = new DiskSpaceInfo[0] }).d; 

这实际上有效,但我不太喜欢它。 还有另一种方式吗? 我想要的是:

 DiskSpaceInfo[] result = JsonConvert.Deserialize(json, skipRoot: true); 

或类似的东西…

如果您知道在这种情况下搜索的内容“d”是一个根节点,那么您可以执行以下操作。

 JObject jo = JObject.Parse(json); DiskSpaceInfo[] diskSpaceArray = jo.SelectToken("d", false).ToObject(); 

如果您只是想忽略您不知道的根类,那么您可以使用“@Giu Do”解决方案,只需使用test2.ToObject(); 而不是Console.Write(test2);

  JObject o = JObject.Parse(json); if (o != null) { var test = o.First; if (test != null) { var test2 = test.First; if (test2 != null) { DiskSpaceInfo[] diskSpaceArray = test2.ToObject(); } } } 

继之前的答案之后,我建议使用您自己的静态实用程序类。 这是可重用的,可以让您获得所需的语法。

 public static class JsonUtil { public static T Deserialize(string json, bool ignoreRoot) where T : class { return ignoreRoot ? JObject.Parse(json)?.Properties()?.First()?.Value?.ToObject() : JObject.Parse(json)?.ToObject(); } } 

你会像这样调用它:

 var resultA = JsonUtil.Deserialize(json, ignoreRoot: true); 

要么

 var resultB = JsonUtil.Deserialize(json, ignoreRoot: false); 

通过Newtonsoft,我想你使用JSon.net ,这是我的解决方案,我在这个框架中使用了Linq到JSon:

 using System; using Newtonsoft.Json.Linq; namespace JSonTest { class Program { static void Main(string[] args) { string json = @"{""d"":[ { ""__type"":""DiskSpaceInfo:#Diagnostics.Common"", ""AvailableSpace"":38076567552, ""Drive"":""C:\\"", ""TotalSpace"":134789197824 }, { ""__type"":""DiskSpaceInfo:#Diagnostics.Common"", ""AvailableSpace"":166942183424, ""Drive"":""D:\\"", ""TotalSpace"":185149157376 } ]}"; JObject o = JObject.Parse(json); if (o != null) { var test = o.First; if (test != null) { var test2 = test.First; if (test2 != null) { Console.Write(test2); } } } Console.Read(); } } } 

我使用了属性First,因为你需要在d之后找到第一个节点,这是你收到的json的第一个节点。

您只需要创建一个重现Main的函数,不要忘记检查对象是否为null以避免NullReferenceException