You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动