将单个KeyValuePair <>序列化为JSON作为父对象的一部分

问题描述 投票:1回答:3

我有一个这样的DTO类:

public class MyDto
{
    public KeyValuePair<string, string> Identifier { get; set; }

    public double Value1 { get; set; }

    public string Value2 { get; set; }
}

两个实例可能看起来像这样:

var results = new List<MyDto> 
{
    new MyDto
    {
        Identifier = new KeyValuePair<string, string>("Car", "Ford"),
        Value1 = 13,
        Value2 = "A"
    },
    new MyDto 
    {
        Identifier = new KeyValuePair<string, string>("Train", "Bombardier"),
        Value1 = 14,
        Value2 = "B"
    },
};

在ASP.NET Web API(使用Json.NET)中序列化结果时,输出如下所示:

[
  {
    "Identifier": {
      "Key": "Car",
      "Value": "Ford"
    },
    "Value1": 13,
    "Value2": "A"
  },
  {
    "Identifier": {
      "Key": "Train",
      "Value": "Bombardier"
    },
    "Value1": 14,
    "Value2": "B"
  }
]

但是我想这样:

[
  {
    "Car": "Ford",
    "Value1": 13,
    "Value2": "A"
  },
  {
    "Train": "Bombardier",
    "Value1": 14,
    "Value2": "B"
  }
]

我该如何实现?我是否需要编写自定义JsonConverter并手动完成所有操作?由于DTO类位于无法访问Json.NET的单独程序集中,因此无法使用特定的Json.NET属性。

我不限于使用KeyValuePair<string, string>。我只需要一个允许我拥有灵活属性名称的数据结构。

c# json asp.net-web-api json.net
3个回答
2
投票

编辑:此答案适用于问题[[最初询问


1
投票
代替KeyValuePair<>,您可以像这样通过应用[JsonExtensionData]轻松地将字典序列化为父对象的一部分:

1
投票
由于standard类位于单独的程序集中,因此您对可以进行的更改种类有限制,那么,是的,我认为最好的选择是为该类创建一个自定义转换器。这样的事情应该起作用:
© www.soinside.com 2019 - 2024. All rights reserved.