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
相关产品推荐
相关产品推荐

