[英]parsing a dynamically changing json file in c#
我正在调用一个Web服务,该服务以以下格式返回json中的响应。
{
"parent":
{
"child": {
"key1": value1,
"key2": value2
}
}
}
上面的答复是当父母中只有一个孩子时。 但是,当父母中有多个孩子时,响应如下所示:
{
"parent": [
{
"child": {
"key1": "value1",
"key2": "value2"
}
},
{
"child": {
"key1": "value1",
"key2": "value2"
}
}
]
}
因此,当有多个子元素时,父元素是JArray,而只有子元素时,父元素是JObject。
现在,我很难动态地解析子元素的内容,因为当它是JObject时会抛出索引错误。
有人可以解释一下我们如何在JObject和JArray中解析内容。
目前,我正在检查父标记是否为JObject / JArray并进行相应的解析,但这是一个漫长而乏味的过程。
是否有任何其他方法可以相同。
以下是我现在正在使用的代码
if(jsonfile["parent"].getType() == "JObject")
{
string value1 = (string)jsonfile["parent"]["child"]["key1"]
}
else
{
string value1 = (string)jsonfile["parent"][0]["child"]["key1"];
}
还有其他方法可以在不检查父对象是JObject还是JArray的情况下获取value1吗?
您可以引入扩展方法,例如
public static class JsonExtensions
{
public static IEnumerable<JToken> SingleOrArrayItems(this JToken source)
{
if (source == null || source.Type == JTokenType.Null)
return Enumerable.Empty<JToken>();
IEnumerable<JToken> arr = source as JArray;
return arr ?? new[] { source };
}
}
然后执行:
var child = jsonfile["parent"].SingleOrArrayItems().FirstOrDefault();
var value1 = child == null ? null : child.SelectToken("child.key1");
或者,您可以将SelectTokens()
与JSONPath
递归下降操作符..
,以代替可选的数组索引:
var value1 = jsonfile.SelectTokens("parent..child.key1").FirstOrDefault();
样品提琴 。
(有关如何处理这种多态JSON的问题经常出现;例如,请参阅如何使用JSON.net处理相同属性的单个项目和数组,以解决将JSON反序列化为固定POCO类型的方法。 )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.