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

C#中如何正确判断JToken是否包含Contact_Name属性有效值

问题根因

遍历JArray得到的result是JToken类型,直接调用Contains("Contact_Name")并非判断JSON对象是否包含指定属性的逻辑。代码中取其他字段时均先执行result.Value<JObject>()将JToken转换为JObject再操作属性,判断环节遗漏了该转换步骤,导致判断逻辑始终无法命中。
同时需要兼容接口返回的两种Contact_Name场景:属性存在但值为null、属性存在且值为嵌套联系人对象,以及属性不存在的边界情况。

修复后完整代码
RestResponse response = await client.GetAsync(request);
var results = JObject.Parse(response.Content);
var array = results["data"].Value<JArray>();
foreach (var result in array)
{
    // 统一将当前数组项转为JObject,避免重复执行类型转换
    var item = result.Value<JObject>();
    
    string _opportunity_description = item["Description"]?.Value<string>();
    string opportunity_id = item["id"]?.Value<string>();
    string opportunity_closing_date = item["Closing_Date"]?.Value<string>();
    string opportunity_closing_date_timestamp = DateTimeOffset.Parse(opportunity_closing_date).ToUnixTimeMilliseconds().ToString();
    string opportunity_stage = item["Stage"]?.Value<string>();
    string opportunity_deal_name = item["Deal_Name"]?.Value<string>();
    string opportunity_probability = item["Probability"]?.Value<string>();
    string opportunity_account_id = item["Account_Name"]?["id"]?.Value<string>();
    string opportunity_deal_owner_email = item["Owner"]?["email"]?.Value<string>();
    string opportunity_deal_contact_id = null;
    string opportunity_deal_contact_name = null;

    // 正确判断逻辑:属性存在 + 值非null + 值为嵌套对象
    if (item.ContainsKey("Contact_Name") 
        && item["Contact_Name"].Type != JTokenType.Null 
        && item["Contact_Name"] is JObject contactObj)
    {
        opportunity_deal_contact_id = contactObj["id"]?.Value<string>();
        opportunity_deal_contact_name = contactObj["name"]?.Value<string>();
        Console.WriteLine("匹配到有效Contact_Name字段,联系人ID:{0}", opportunity_deal_contact_id);
    }
}
关键注意点
  • 判断JSON对象属性是否存在,必须先将JToken转换为JObject,调用ContainsKey方法实现,不要直接在JToken上调用Contains
  • 所有字段取值时建议添加?.空值传播运算符,避免字段缺失、值为null时触发空引用异常
  • 额外判断JTokenType.Null,适配接口返回"Contact_Name": null的场景,避免将null值识别为有效联系人对象
  • 使用is JObject contactObj模式匹配直接获取嵌套的联系人对象,省去重复类型转换代码,可读性更高

内容的提问来源于stack exchange,提问作者redbeard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:18:24