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

求助:将树形结构JSON转列表并写入SQL数据库的方法

解决JSON树形结构提取数据并存入SQL的问题

嘿,我来帮你搞定这个问题!你的JSON结构比较特殊——邮箱地址是顶层的键,每个键对应包含状态信息的子对象,所以核心是遍历这个JObject的所有键值对,把邮箱和对应的属性关联起来。

步骤1:解析JSON并提取数据

你已经用Newtonsoft.Json(Json.NET)把JSON转成了JObject,接下来只需要遍历它的Properties()集合,每个JProperty就对应一个邮箱的完整数据:

首先可以定义一个实体类来统一存储数据(让代码更清晰):

public class EmailStatus
{
    public string Email { get; set; }
    public DateTime Time { get; set; }
    public string Type { get; set; }
    public string BounceType { get; set; }
    public string BounceSubType { get; set; }
}

然后遍历JObject,把数据填充到实体列表中:

// 建议用await替代.Result,避免线程阻塞
string JSON = await response.Content.ReadAsStringAsync();
var jObj = (JObject)JsonConvert.DeserializeObject(JSON);

var emailStatusList = new List<EmailStatus>();

foreach (var property in jObj.Properties())
{
    // 顶层键就是邮箱地址
    string email = property.Name;
    
    // 把属性值转成JObject,方便提取子节点数据
    var statusDetails = property.Value as JObject;
    
    // 提取子属性,注意处理JSON中的"null"字符串(转换成实际的null)
    DateTime time = statusDetails["time"].ToObject<DateTime>();
    string type = statusDetails["type"].ToString();
    string bounceType = statusDetails["bounceType"].ToString();
    bounceType = string.Equals(bounceType, "null", StringComparison.OrdinalIgnoreCase) ? null : bounceType;
    string bounceSubType = statusDetails["bounceSubType"].ToString();
    bounceSubType = string.Equals(bounceSubType, "null", StringComparison.OrdinalIgnoreCase) ? null : bounceSubType;
    
    emailStatusList.Add(new EmailStatus
    {
        Email = email,
        Time = time,
        Type = type,
        BounceType = bounceType,
        BounceSubType = bounceSubType
    });
}

步骤2:存入SQL数据库

拿到整理好的emailStatusList后,就可以批量或者逐条插入数据库了。这里用ADO.NET举个例子(如果用EF会更简洁,原理类似):

// 替换成你的数据库连接字符串
string connectionString = "Server=your-server;Database=your-db;Trusted_Connection=True;";

using (var connection = new SqlConnection(connectionString))
{
    connection.Open();
    string insertSql = @"
        INSERT INTO YourEmailTable (Email, time, type, bounceType, bounceSubType)
        VALUES (@Email, @Time, @Type, @BounceType, @BounceSubType)";
    
    foreach (var status in emailStatusList)
    {
        using (var cmd = new SqlCommand(insertSql, connection))
        {
            // 添加参数,避免SQL注入
            cmd.Parameters.AddWithValue("@Email", status.Email);
            cmd.Parameters.AddWithValue("@Time", status.Time);
            cmd.Parameters.AddWithValue("@Type", status.Type);
            // 数据库中如果允许null,要把C#的null转换成DBNull.Value
            cmd.Parameters.AddWithValue("@BounceType", status.BounceType ?? DBNull.Value);
            cmd.Parameters.AddWithValue("@BounceSubType", status.BounceSubType ?? DBNull.Value);
            
            cmd.ExecuteNonQuery();
        }
    }
}

几个关键注意点

  • 处理"null"字符串:你的JSON里bounceType和bounceSubType是字符串"null",不是真正的null值,所以要手动转换成C#的null,再存入数据库时转成DBNull.Value,避免数据库里存成字符串"null"。
  • 异步优化:尽量用await response.Content.ReadAsStringAsync()替代.Result,后者可能导致线程阻塞和死锁问题。
  • SQL注入防护:一定要用参数化查询,不要直接拼接SQL语句,避免安全风险。

内容的提问来源于stack exchange,提问作者riya mahanty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:26:58