将JSON反序列化为C#动态对象?

1180

有没有一种方法可以将JSON内容反序列化为C#动态类型? 能够跳过创建大量的类以使用DataContractJsonSerializer将是很好的。


7
如果你需要一些“动态”的东西,为什么不使用大多数JSON解码器自带的get-style访问器,而不是转换成普通的对象?(例如,是否真的需要创建“动态”对象?)json.org上有许多C# JSON实现的链接。 - user166390
我正在开发一个项目,试图将外部依赖降至最低。因此,如果可以使用标准的 .net 序列化程序和类型来完成某些任务,那将是首选。当然,如果不可能,我会使用 json.org。谢谢! - jswanson
54
C#团队增加了“dynamic”关键字,这让我感到很惊讶。但是在CLR中却没有办法将JSON对象转换为动态的CLR类实例。 - Frank Schwieterman
2
很不幸,被采纳的答案在.NET 4 RTM中无法使用。我发布了一个帮助我开始使用它的答案,可能对其他人有用。 - Drew Noakes
更新于2018年10月,这就是魔法发生的方式:https://dev59.com/iGgu5IYBdhLWcg3winc3#48023576 - Ole EH Dufour
你应该注意到我遇到的问题:我非常幸运,在使用Visual Studio创建类并使用“编辑”>“特殊粘贴”>“将JSON粘贴为类”之后,才发现了这个伟大的线程。像那样创建类使得智能感知可以完美地适用于给定的JSON结构。这是绝对必要的,因为JSON字符串非常庞大-370k。它是使用“ytdlp --dump-json”获取有关YouTube视频的大量信息,其中包含数十个JSON项。 - Tonecops
32个回答

0
我需要返回一个具有不同字段的JSON模型。 我的模型是这样的,但它可能会改变。
{
    "employees":
    [
        { "name": "Darth", "surname": "Vader", "age": "27", "department": "finance"},
        { "name": "Luke", "surname": "Skywalker", "age": "25", "department": "IT"},
        { "name": "Han", "surname": "Solo", "age": "26", "department": "credit"}
    ]
}

获取数据值列表

    JObject array = JObject.Parse(model.JsonData);
    var tableData = new List<JsonDynamicModel>();

    foreach (var objx in array.Descendants().OfType<JProperty>().Where(p => p.Value.Type != JTokenType.Array && p.Value.Type != JTokenType.Object))
            {
                var name = ((JValue)objx.Name).Value;
                var value = ((JValue)objx.Value).Value;
                if (tableData.FirstOrDefault(x => x.ColumnName == name.ToString()) == null)
                {
                    tableData.Add(new JsonDynamicModel
                    {
                        ColumnName = name.ToString(),
                        Values = new List<string> { value.ToString() },
                    });
                }
                else
                {
                    tableData.FirstOrDefault(x=>x.ColumnName == name.ToString()).Values.Add(value.ToString());
                }
            }

输出结果如下。然后我将生成的模型转换为HTML表格,使用了这种方法来创建HTML表格。
// output
tableData[0].ColumnName -> "name";
tableData[0].Values -> {"Darth", "Luke", "Han" }
tableData[1].ColumnName -> "surname";
tableData[1].Values -> {"Vader", "Skywalker", "Solo" }
...

-1
string jsonString = @"
            {
                ""Name"": ""Squid Game"",
                ""Genre"": ""Thriller"",
                ""Rating"": {
                    ""Imdb"": 8.1,
                    ""Rotten Tomatoes"": 0.94
                },
                ""Year"": 2021,
                ""Stars"": [""Lee Jung-jae"", ""Park Hae-soo""],
                ""Language"": ""Korean"",
                ""Budget"": ""$21.4 million""
            }";

            Dictionary<string, string> dic = new Dictionary<string, string>();
            JObject dynamicObject = JsonConvert.DeserializeObject<dynamic>(jsonString);
            IEnumerable<JToken> list = ((IEnumerable<JToken>)dynamicObject).ToList();

            foreach (JToken token in list)
            {
                string key = ((JProperty)token).Path;
                string value = ((JProperty)token).Value.ToString();

                dic.Add(key, value);
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接