求助:将树形结构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
相关产品推荐
相关产品推荐

