执行.NET C#代码遇间歇性错误:JValue无'value'定义
解决.NET C#动态解析JSON的间歇性RuntimeBinderException错误
错误信息:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Newtonsoft.Json.Linq.JValue' does not contain a definition for 'value'
问题根源:返回的JSON中responseObject.value结构不固定——有时是包含token属性的对象,有时是字符串、数字这类基础值类型(对应Newtonsoft.Json中的JValue)。用dynamic类型直接访问.token时,若value是JValue就会触发异常,所以错误呈间歇性。
以下是几种解决方案:
方案1:强类型解析(推荐)
定义与JSON结构匹配的实体类,通过强类型反序列化避免动态类型的不确定性,同时兼容结构变化:
public class ResponseRoot { public ResponseObject responseObject { get; set; } } public class ResponseObject { // 用JToken兼容value的多种类型 public JToken value { get; set; } } // 反序列化 var root = JsonConvert.DeserializeObject<ResponseRoot>(response); // 检查value是否为对象并提取token string token = null; if (root.responseObject.value.Type == JTokenType.Object) { token = root.responseObject.value["token"]?.ToString(); }
方案2:直接用JToken解析
放弃dynamic,用JToken的类型检查逻辑处理结构变化:
JToken root = JToken.Parse(response); JToken valueNode = root.SelectToken("responseObject.value"); string token = null; if (valueNode != null && valueNode.Type == JTokenType.Object) { token = valueNode["token"]?.ToString(); }
方案3:保留dynamic但增加类型判断
如果必须用dynamic,先判断value的类型再访问属性:
dynamic obj = JsonConvert.DeserializeObject(response); dynamic value = obj.responseObject.value; string token = null; if (value is JObject valueObj) { token = valueObj["token"]?.ToString(); }
内容的提问来源于stack exchange,提问作者qaguru
相关产品推荐
相关产品推荐

