如何从指定格式JSON字符串取值?DataTable转JSON后取值为空求助
问题分析与解决方案
你的问题出在JSON结构是双重序列化的嵌套格式,直接访问User_Email找不到对应键是因为你没处理内层的嵌套JSON字符串。我们一步步拆解解决:
为什么会拿到null?
先看你得到的JSON结构:
{ "CheckUserResult": "{\"Table\":[{\"User_ID\":4,\"User_Name\":\"I$ks\",\"User_Email\":\"23*******@gmail.com\",...}]}" }
外层JSON只有一个键CheckUserResult,它的值不是直接的对象,而是另一个被转义的JSON字符串(里面的\"是转义引号)。你之前直接尝试访问userdata["User_Email"],相当于在只有CheckUserResult键的外层对象里找不存在的键,结果自然是null。
解决方案分两种场景:
场景1:可以修改序列化代码(从根源避免嵌套)
你原本的代码return JsonConvert.SerializeObject(ds.Tables[0]);已经把DataTable序列化成了JSON字符串,但看起来你的代码外层又被自动序列化了一次(比如ASP.NET Web API返回时框架会自动序列化,导致双重序列化)。
解决方法是只序列化一次:
- 如果是ASP.NET/Web API,直接返回
ds.Tables[0],框架会自动帮你序列化为正确的JSON,不需要手动调用JsonConvert.SerializeObject。 - 如果你必须手动处理,确保只调用一次序列化,不要在外层再包裹序列化。
修改后你会得到直接包含Table数组的JSON,这时直接解析就能访问User_Email了。
场景2:已经拿到了嵌套的JSON字符串(只能处理现有数据)
如果没法修改序列化的代码,需要分两步解析嵌套的JSON:
方法1:使用强类型解析(推荐,类型安全)
首先定义对应的数据类:
// 用户详情类 public class UserDetail { public int User_ID { get; set; } public string User_Name { get; set; } public string User_Email { get; set; } public string User_PhoneNumber { get; set; } public DateTime User_DateOfBirth { get; set; } public string User_City { get; set; } public bool? User_Admin { get; set; } public int User_Points { get; set; } public string User_Login_Provider { get; set; } } // 内层响应结构 public class CheckUserResponse { public List<UserDetail> Table { get; set; } } // 外层响应结构 public class OuterResponse { public string CheckUserResult { get; set; } }
然后分步解析:
// 假设你的JSON字符串是jsonStr var outerResponse = JsonConvert.DeserializeObject<OuterResponse>(jsonStr); // 解析内层的JSON字符串 var innerResponse = JsonConvert.DeserializeObject<CheckUserResponse>(outerResponse.CheckUserResult); // 取Table数组中的第一个用户(根据你的数据,数组里只有一个元素) var targetUser = innerResponse.Table.FirstOrDefault(); if (targetUser != null) { Userdetails.User_Email = targetUser.User_Email; // 现在能正确获取邮箱了 }
方法2:使用动态类型解析(快速测试用)
如果不想定义实体类,也可以用dynamic类型:
var outer = JsonConvert.DeserializeObject<dynamic>(jsonStr); // 先拿到内层的JSON字符串 var innerJson = outer.CheckUserResult; // 再解析内层JSON var innerData = JsonConvert.DeserializeObject<dynamic>(innerJson); // 从Table数组中取第一个用户 var user = innerData.Table[0]; Userdetails.User_Email = user.User_Email;
这样就能正确获取到User_Email的值了。
内容的提问来源于stack exchange,提问作者Praveen Bamane
相关产品推荐
相关产品推荐

