反序列化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 。