Newtonsoft.Json循环遍历报错但绝对路径取值正常该如何解决
错误原因
你调用JObject.Parse解析后,ratesjson["Valute"]对应的是一个JObject类型的对象,直接遍历这个对象得到的每个元素是JProperty实例(每个JProperty的Key是AUD、USD这类货币编码,Value才是包含CharCode、Value等字段的货币信息对象)。你直接用x["CharCode"]访问JProperty的子节点,自然就抛出Cannot access child value on Newtonsoft.Json.Linq.JProperty异常。
而你用绝对路径ratesjson["Valute"]["AUD"]["CharCode"]访问的时候,实际上是跳过了遍历JProperty的步骤,直接通过Key取到了对应JProperty的Value,所以可以正常取值。
修复方案
两种修改方式任选即可:
方式1:遍历Valute下的所有JObject值
直接通过Values<JObject>()取到所有货币信息对象再遍历,修改你的foreach代码:
foreach (var x in ratesjson["Valute"].Values<JObject>()) { CurrencyRateMap crm = new CurrencyRateMap { CurrencyCode = (string)x["CharCode"], CurrencyRate = (double)x["Value"] }; list.Add(crm); }
方式2:遍历JProperty后显式取Value
把遍历的变量显式声明为JProperty,再取Value属性作为操作对象:
foreach (JProperty prop in ratesjson["Valute"]) { var x = (JObject)prop.Value; CurrencyRateMap crm = new CurrencyRateMap { CurrencyCode = (string)x["CharCode"], CurrencyRate = (double)x["Value"] }; list.Add(crm); }
额外优化建议
- 不要每次请求都new HttpClient,会导致端口占用问题,建议全局复用单例HttpClient实例
- 取值时可以用Newtonsoft提供的泛型
Value<T>()方法代替强转,类型兼容性更好,例如x.Value<double>("Value")
内容的提问来源于stack exchange,提问作者Pavel Polushin
相关产品推荐
相关产品推荐

