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
相关产品推荐
相关产品推荐

