C#解析JSON按dueNum获取monthlyAnnualCostRate报错解决
问题原因
抛出Newtonsoft.Json.JsonReaderException的核心原因是JSON解析逻辑和接口实际返回结构不匹配:
- 接口返回的JSON根节点为Object类型,需要查询的还款计划记录数组,实际嵌套在响应的
data.list路径下 - 原代码直接调用
JArray.Parse()尝试将整个响应内容解析为数组,类型不匹配直接触发异常
修复实现
替换原有的JSON解析和查询逻辑即可,代码中增加了节点空值校验,避免接口返回结构异常时触发空引用错误:
string uri = "https://apis.garantibbva.com.tr:443/loans/v1/paymentPlan"; var client = new RestClient(uri); var request = new RestRequest(Method.POST); request.AddHeader("apikey", "l7xx8af86c14ea7e44e0ab3fbfcc6137ae09"); request.AddQueryParameter("loanType", "1"); request.AddQueryParameter("campaignCode", "BankSearch"); request.AddQueryParameter("loanAmount", "10000"); IRestResponse response = client.Execute(request); var dueNum = 46; double monthlyAnnualCostRate = default; // 第一步:解析根级JSON对象 var root = JObject.Parse(response.Content); // 第二步:定位到data下的list数组,做类型和空值校验 if (root["data"]?["list"] is JArray paymentPlans) { // 第三步:按dueNum匹配对应记录,取目标字段值 monthlyAnnualCostRate = paymentPlans .FirstOrDefault(p => p["dueNum"] != null && (int)p["dueNum"] == dueNum)? ["monthlyAnnualCostRate"]?.ToObject<double>() ?? default; } _logger.LogInformation("Garanti Bankası Response: {monthlyAnnualCostRate}", monthlyAnnualCostRate); _logger.LogInformation("Garanti Bankası geçti");
效果验证
传入dueNum=46时,代码会正确遍历data.list下的所有期数记录,匹配到对应项后取到monthlyAnnualCostRate值为1.8800,符合业务预期。
补充提示:如果需要区分「接口返回结构异常」「未找到对应期数记录」「正常取到值」三种场景,可以在对应的判断分支增加日志埋点,方便线上问题排查。
内容的提问来源于stack exchange,提问作者Oguzhan Durmaz
相关产品推荐
相关产品推荐

