【问题标题】:Json serialization of a nested Dictionary returns { "key": "key1", "value": "value1" }嵌套字典的 Json 序列化返回 { "key": "key1", "value": "value1" }
【发布时间】:2020-08-18 09:27:29
【问题描述】:

我目前正在开发一个 web 服务,并且我有这种行为,直到今天我还没有遇到过。这是我要返回的课程:

public class Block
{
    public int order { get; set; }
    public string title { get; set; }
    public Dictionary<string, object> attributes { get; set; }
}

attributes 可以包含任何类型的值:简单类型、对象、数组等。

当我通过我的网络服务返回一个Block 对象时,我得到了:

{
    "order": 1,
    "attributes": [
        {
            "Key": "key1",
            "Value": "value1"
        },
        {
            "Key": "key2",
            "Value": "value2"
        }
    ],
    "title": "Title"
}

有谁知道我为什么不简单地得到 "key1": "value1" 输出?

【问题讨论】:

  • 也许您可以向我们展示您用于序列化对象的代码!

标签: c# json dictionary


【解决方案1】:

首先你的 JSON 无效,请注意"order": 1 这行之后没有,

修改后你可以像这样改变你的类结构

    public class Attribute
    {
        public string Key { get; set; }
        public object Value { get; set; }
    }

    public class Block
    {
        public int order { get; set; }
        public List<Attribute> attributes { get; set; }
        public string title { get; set; }
    }

这样你就可以反序列化你的 JSON,我只是使用这个网站 https://json2csharp.com/ 将你的 JSON 转换为 C# 类

至于用法,您可以执行 .FirstOrDefault(x=>x.Key=="key1") 来获取您想要的任何数据,或者如果您将一个一个处理所有列表,您可以简单地执行 attributes.Count

【讨论】:

  • 感谢您的回答,但看起来您在这里错过了重点。首先,我从 C# 类生成一个 json,因此使用 json2csharp 将与我需要的相反。然后,我不想在我的 json 输出中有一个 "key": "key1", "value": "value1",这正是这个 Attribute 类要做的。
【解决方案2】:

当我这样做时

    var x = new Class
    {
        order = 1,
        title = "Title",
        attributes = new Dictionary<string, object>
        {
            { "key1", "value1" },
            { "key2", "value2" }
        }
    };

    var json = JsonConvert.SerializeObject(x);
    Console.WriteLine(json);

我明白了

{"order":1,"title":"Title","attributes":{"key1":"value1","key2":"value2"}}

您有序列化数据的代码还是 ASP.NET 为您做的?

【讨论】:

  • ASP.NET 为我做这件事。当我用 Newtonsoft.json 序列化它时,我的输出和你一样。
  • @Skefrep 我刚刚尝试了一个 .NET core 3.1 项目,ASP.NET 也“正确”地对其进行了序列化。你用的是什么框架?
  • 我尝试制作一个 4.8 项目并将 config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")) 添加到 WebApiConfig 中,它还可以像您期望的那样进行序列化。你能展示你的控制器和 WebApiConfig 吗?
  • 好的,我终于找到了另一个问题,与我遇到的问题相同:stackoverflow.com/questions/7590088/… 我不知道 WCF 在序列化方面有不同的行为。
猜你喜欢
  • 2015-11-22
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 2018-02-10
相关资源
最近更新 更多