解析JSON字符串时无法获取data数组内的balance字段,求解决办法
解决JSON外层带引号的解析问题
问题分析
你实际收到的是被外层双引号包裹的JSON字符串,本质是一个JSON字符串类型的值,而非直接的JSON对象。虽然你能通过JObject.Parse(json)["success"]拿到success值,但这是因为解析逻辑没有正确处理嵌套的JSON结构,导致无法访问内层data数组的字段。
可行解决方法
方法1:先解析外层字符串,再二次解析内部JSON
这是最稳妥的方式,先通过JToken.Parse取出内层的JSON内容,再解析为JObject:
// 第一步:解析外层字符串,获取内部的JSON文本 string innerJson = JToken.Parse(json).ToString(); // 第二步:将内部JSON解析为JObject JObject rootObj = JObject.Parse(innerJson); // 获取success字段 bool success = rootObj["success"].Value<bool>(); // 获取data数组中第一个元素的balance字段 decimal balance = rootObj["serviceResponse"]["data"][0]["balance"].Value<decimal>();
方法2:手动去除外层引号(仅适用于格式固定的场景)
如果能确保字符串首尾只有双引号,且内部没有未转义的双引号,可以直接修剪引号后解析:
// 去除首尾的双引号 string cleanedJson = json.Trim('"'); JObject rootObj = JObject.Parse(cleanedJson); // 后续取值逻辑同方法1
⚠️ 注意:如果JSON内部包含转义的双引号(如\"),这种方法会破坏JSON结构,不推荐作为通用方案。
方法3:使用强类型实体类反序列化(更规范的生产级方案)
定义与JSON结构匹配的实体类,通过两次反序列化完成解析:
// 定义实体类 public class WalletInfo { public string cardNo { get; set; } public string personnelNo { get; set; } public string name { get; set; } public string surname { get; set; } public decimal balance { get; set; } public int walletId { get; set; } public string walletName { get; set; } } public class ServiceResponse { public List<WalletInfo> data { get; set; } public string responseMessage { get; set; } public int responseCode { get; set; } } public class ApiResponse { public ServiceResponse serviceResponse { get; set; } public bool success { get; set; } public int responseCode { get; set; } public string responseMessage { get; set; } } // 解析逻辑 // 先取出内层JSON字符串 string innerJson = JToken.Parse(json).ToString(); // 反序列化为强类型对象 ApiResponse response = JsonConvert.DeserializeObject<ApiResponse>(innerJson); // 直接访问字段 bool success = response.success; decimal balance = response.serviceResponse.data[0].balance;
内容的提问来源于stack exchange,提问作者mertckr
相关产品推荐
相关产品推荐

