C#中从JSON提取指定值:如何获取Info中的Id?
解决Newtonsoft.Json中"cannot access child value on JProperty"错误的思路
你碰到的这个报错,本质是你的JSON结构和代码里的访问逻辑不匹配,咱们一步步来修正:
先明确问题根源
你提供的JSON结构是这样的:
{"5aa891cd1e1422452e8b4567": { "info": { "id": "5aa891" } }}
这里根本没有events这个字段,但你代码里却试图访问jsonDATA["events"]——这是第一个错误。另外,当你直接遍历JObject的元素时,拿到的是JProperty类型(它代表JSON里的键值对整体),直接用e["info"]去访问子属性自然会报错,因为JProperty不是一个可直接访问子节点的对象。
正确的解决代码
情况1:遍历所有顶级对象(如果有多个匹配项)
用Properties()方法遍历JObject的键值对,先获取JProperty的Value(也就是对应的对象),再访问子属性:
var jsonDATA = JObject.Parse(data); foreach (var prop in jsonDATA.Properties()) { // prop.Name 就是顶级的ID字符串:"5aa891cd1e1422452e8b4567" var eventObject = prop.Value; var targetId = eventObject["info"]["id"].ToString(); // 这里就可以拿到你要的info里的id了 }
情况2:确定只有一个匹配项
如果你的JSON里只会有这一个顶级对象,也可以不用遍历,直接取第一个值:
var jsonDATA = JObject.Parse(data); var singleEvent = jsonDATA.Values().First(); var targetId = singleEvent["info"]["id"].ToString();
额外说明
JProperty是Newtonsoft.Json里用来表示JSON键值对的类型,它包含Name(键)和Value(对应的值)两个部分。你之前直接对JProperty调用["info"],相当于试图在键值对这个整体上找子节点,这不符合它的结构,所以才会抛出那个错误。
内容的提问来源于stack exchange,提问作者karlo
相关产品推荐
相关产品推荐

