【发布时间】:2020-08-31 01:58:44
【问题描述】:
我有一个这样的 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>。我只需要一个允许我拥有灵活属性名称的数据结构。
【问题讨论】:
-
.NET Core 3+ 中 JSON 的
System.Text.Json实现目前有很多限制,其中之一是它无法正确序列化KeyValuePair<TKey, TValue>属性。目前计划在 .NET 5.0(将于 2020 年 11 月发布)中解决此问题正在此处跟踪:github.com/dotnet/runtime/issues/30524 -
@silkfire 使用 Json.NET 序列化这两个实例时
-
我使用的是 .NET Framework,而不是 .NET Core
-
我必须写一个自定义的 JsonConverter - 他们真的没有那么复杂。但最简单的方法是像 Marc 在他的回答中建议的那样,只使用一个条目字典。
-
无法添加 Json.NET 属性但可以添加自己的自定义属性吗?
标签: c# json asp.net-web-api json.net