You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:15:42