如何通过RestSharp从JSON响应获取contactId并解决空引用异常?
如何用RestSharp从JSON响应中提取contactId值?
嘿,我一眼就看出问题所在了:你一直在响应头(Headers)里找contactId,但这个值根本不在那儿!它其实在API返回的响应体JSON内容里,这就是为什么你会触发NullReferenceException——Find(x => x.Name == "contactId")返回了null,再调用Value.ToString()自然就报错了。
咱们来修正这个问题,有两种常用的方法,你可以选适合自己的:
方法1:用Newtonsoft.Json手动解析JSON响应体
首先确保你已经安装了Newtonsoft.Json NuGet包,然后修改你的代码:
using Newtonsoft.Json.Linq; var client2 = new RestClient("https://api.getresponse.com/v3/contacts?query[email]=test@gmail.com"); var request2 = new RestRequest(Method.GET); request2.AddHeader("X-Auth-Token", "api-key 948dff90-my-key-f3c6"); // 注意:GET请求不需要添加RequestBody参数,这行可以删掉 // request2.AddParameter("application/json", ParameterType.RequestBody); var response2 = client2.Execute(request2); // 先做安全检查:确保请求成功且响应内容不为空 if (response2.IsSuccessful && !string.IsNullOrEmpty(response2.Content)) { // GetResponse的这个API返回的是联系人数组,所以用JArray解析 var contactsArray = JArray.Parse(response2.Content); if (contactsArray.Count > 0) { // 取第一个匹配联系人的contactId string contactId = contactsArray[0]["contactId"].ToString(); // 这里就可以使用contactId啦 Console.WriteLine($"找到的contactId是:{contactId}"); } else { Console.WriteLine("没有找到匹配该邮箱的联系人"); } } else { Console.WriteLine($"请求失败:{response2.ErrorMessage ?? "未知错误"}"); }
方法2:用RestSharp内置序列化器做强类型解析
这种方式更类型安全,适合需要用到多个字段的场景:
首先定义一个对应API返回结构的类:
public class GetResponseContact { public string contactId { get; set; } // 可以根据需求添加其他字段,比如email、name等 }
然后修改请求代码,直接反序列化响应:
var client2 = new RestClient("https://api.getresponse.com/v3/contacts?query[email]=test@gmail.com"); var request2 = new RestRequest(Method.GET); request2.AddHeader("X-Auth-Token", "api-key 948dff90-my-key-f3c6"); // 直接把响应反序列化为联系人列表 var response2 = client2.Execute<List<GetResponseContact>>(request2); if (response2.IsSuccessful && response2.Data != null && response2.Data.Count > 0) { string contactId = response2.Data[0].contactId; Console.WriteLine($"找到的contactId是:{contactId}"); } else { Console.WriteLine($"请求失败或无匹配联系人:{response2.ErrorMessage ?? "无返回数据"}"); }
额外提醒
- 你之前添加的
request2.AddParameter("application/json", ParameterType.RequestBody);完全没必要,GET请求不需要请求体,删掉它可以避免潜在的请求格式问题。 - 一定要先检查
response2.IsSuccessful和响应内容是否为空,不然很容易再次遇到空引用异常哦。
内容的提问来源于stack exchange,提问作者Kevin himch
相关产品推荐
相关产品推荐

