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

C#无实体类解析JSON并输出/写入SQL表求助

无实体类解析JSON提取指定字段方案

1. 替代Flatten的字段提取方法

直接递归遍历JSON结构,定位包含ID、Type、Name的节点,提取键值对,避免Flatten带来的路径冗余问题。以下是基于Newtonsoft.Json的实现代码:

using Newtonsoft.Json.Linq;
using System.Collections.Generic;

public List<Dictionary<string, object>> ExtractTargetFields(string jsonStr)
{
    var result = new List<Dictionary<string, object>>();
    var root = JToken.Parse(jsonStr);
    
    TraverseToken(root, result);
    return result;
}

private void TraverseToken(JToken token, List<Dictionary<string, object>> result)
{
    if (token.Type == JTokenType.Object)
    {
        var obj = (JObject)token;
        bool hasRequiredFields = obj.ContainsKey("ID") && obj.ContainsKey("Type") && obj.ContainsKey("Name");
        
        if (hasRequiredFields)
        {
            var fieldSet = new Dictionary<string, object>
            {
                ["ID"] = obj["ID"].ToObject<object>(),
                ["Type"] = obj["Type"].ToObject<object>(),
                ["Name"] = obj["Name"].ToObject<object>()
            };
            result.Add(fieldSet);
        }
        
        // 递归遍历所有子属性
        foreach (var prop in obj.Properties())
        {
            TraverseToken(prop.Value, result);
        }
    }
    else if (token.Type == JTokenType.Array)
    {
        // 遍历数组中的每个元素
        foreach (var item in (JArray)token)
        {
            TraverseToken(item, result);
        }
    }
}

这段代码会自动遍历JSON的所有层级,只要某个对象节点同时包含三个目标字段,就会将其提取为一个字典存入结果列表,输出格式完全符合清晰键值对的需求。

2. 写入SQL表的实现

提取到字段后,可通过两种方式写入SQL表:

单条插入(适合小数据量)

用参数化SQL避免注入风险:

using System.Data.SqlClient;

public void InsertToSql(List<Dictionary<string, object>> data, string connStr, string tableName)
{
    using (var conn = new SqlConnection(connStr))
    {
        conn.Open();
        foreach (var item in data)
        {
            string sql = $"INSERT INTO {tableName} (ID, Type, Name) VALUES (@ID, @Type, @Name)";
            using (var cmd = new SqlCommand(sql, conn))
            {
                cmd.Parameters.AddWithValue("@ID", item["ID"]);
                cmd.Parameters.AddWithValue("@Type", item["Type"]);
                cmd.Parameters.AddWithValue("@Name", item["Name"]);
                cmd.ExecuteNonQuery();
            }
        }
    }
}

批量写入(适合大数据量)

用SqlBulkCopy提升效率:

using System.Data;
using System.Data.SqlClient;

public void BulkInsertToSql(List<Dictionary<string, object>> data, string connStr, string tableName)
{
    var dataTable = new DataTable();
    dataTable.Columns.Add("ID", typeof(object));
    dataTable.Columns.Add("Type", typeof(object));
    dataTable.Columns.Add("Name", typeof(object));
    
    foreach (var item in data)
    {
        dataTable.Rows.Add(item["ID"], item["Type"], item["Name"]);
    }
    
    using (var conn = new SqlConnection(connStr))
    {
        conn.Open();
        using (var bulkCopy = new SqlBulkCopy(conn))
        {
            bulkCopy.DestinationTableName = tableName;
            bulkCopy.WriteToServer(dataTable);
        }
    }
}

灵活调整说明

如果你的JSON中目标字段可能分散在不同节点、或者字段名存在大小写差异,可以修改TraverseToken中的判断逻辑,比如单独检查每个字段是否存在,或者用obj.Properties().Any(p => p.Name.Equals("ID", StringComparison.OrdinalIgnoreCase))忽略大小写匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:47:16