如何在C#中将非同构JSON转换为Dictionary<string,string>?
解决非同构JSON转Dictionary<string, string>的问题
嘿,针对你用Newtonsoft.Json处理非同构JSON转Dictionary<string, string>的需求,我给你两个实用的方案,都能完美适配这种每个对象字段不一致的场景:
方案一:使用JObject遍历属性(直观可控)
这种方式通过Newtonsoft的LINQ to JSON API直接操作JSON结构,能清晰处理每个键值对:
using Newtonsoft.Json.Linq; // 你的原始JSON字符串 string jsonData = @"[{ '_type': 'StatsItem', 'Noofpostcomments': 0, 'URL': 'https://www.website.com/', 'posts': 1, 'Brand': 'Halfords', 'Likes': 24884, 'movedTo': 'FB', 'sharing': 0, 'talked': 94, 'following': '24757', 'Date': '27-Mar-2018', 'unpopular': 0, 'ID': '2453' }, { '_type': 'StatsItem', 'qualify': 53, 'URL': 'https://www.website.com/' }]"; // 解析JSON数组 JArray jsonArray = JArray.Parse(jsonData); List<Dictionary<string, string>> result = new List<Dictionary<string, string>>(); foreach (JObject jsonObj in jsonArray) { Dictionary<string, string> itemDict = new Dictionary<string, string>(); // 遍历当前JSON对象的所有属性 foreach (var property in jsonObj.Properties()) { // 将任意类型的值转为字符串(数字、布尔、字符串都适用) itemDict[property.Name] = property.Value.ToString(); } result.Add(itemDict); }
方案二:反序列化后转换(简洁高效)
如果你喜欢更简洁的写法,可以先把JSON反序列化为Dictionary<string, object>的列表,再统一把值转成字符串:
using Newtonsoft.Json; using System.Linq; string jsonData = @"[{ '_type': 'StatsItem', 'Noofpostcomments': 0, 'URL': 'https://www.website.com/', 'posts': 1, 'Brand': 'Halfords', 'Likes': 24884, 'movedTo': 'FB', 'sharing': 0, 'talked': 94, 'following': '24757', 'Date': '27-Mar-2018', 'unpopular': 0, 'ID': '2453' }, { '_type': 'StatsItem', 'qualify': 53, 'URL': 'https://www.website.com/' }]"; // 先反序列化为Object类型的字典列表 var rawDictionaries = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(jsonData); // 转换为string类型的字典列表,处理null值 var result = rawDictionaries .Select(dict => dict.ToDictionary( kv => kv.Key, kv => kv.Value?.ToString() ?? string.Empty // 防止值为null时报错 )) .ToList();
注意事项
- 两种方案都能自动适配非同构JSON,不管每个对象有多少不同的字段,都会被完整捕获到字典中
- 如果JSON里有嵌套的对象或数组,
ToString()会把它们转成JSON格式的字符串,如果你需要特殊处理嵌套结构,可以在遍历的时候加判断(比如检查property.Value.Type)
内容的提问来源于stack exchange,提问作者skhurams




