You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从指定格式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:54:45