字典序列化:System.Exception:类型 <Type> 不是字典

Dictionary serialization: System.Exception: Type <Type> is not a dictionary

我的类型中有一本字典,我想将其作为控制器的输入:

using Newtonsoft.Json;

namespace LM.WebApp.Models.ApiModels;

[JsonDictionary]
public class Values
{
    public Dictionary<string, string> values { get; set; }
}

public class Data
{
    public bool is_active { get; set; }
    public IList<string> labels { get; set; }
    public string name { get; set; }
    public Values values { get; set; }
}

public class DictionaryImportApiModel
{
    public IList<Data> data { get; set; }
}

我正在通过此测试的输入 JSON:

{
  "data":
  [
    {
      "is_active": true,
      "labels": [
        "SYSTEM",
        "EXTERNAL"
      ],
      "name": "MEDICATION_REQUEST_INTENT",
      "values": {
        "order": "Замовлення ліків",
        "plan": "План застосування"
      }
    }
  ]
}

并从问题标题和入站空字典中获取错误 object。我已将 Newtonsoft.Json 序列化器更改为 Microsoft.AspNetCore.Mvc.NewtonsoftJson 并从 Values class 中删除属性 [JsonDictionary] 并在 AddControllersWithViews 之后添加 .AddNewtonsoftJson() Startup。异常消失,但入站 object 中的字典仍然为空。是否有必要使用自定义转换器(如 this) 处理字典?

Data 模型的 values 类型更改为 Dictionary<string, string>:

public class Data
{
    public bool is_active { get; set; }
    public IList<string> labels { get; set; }
    public string name { get; set; }
    public Dictionary<string, string> values { get; set; }
}

主要 .NET json 序列化器(Newtonsoft.JsonSystem.Text.Json 支持的约定之一,可能还有其他一些,但尚未使用它们)正在转换 json 对象到 Dictionary,所以你不需要额外的包装器 class Values.

P.S.

除非您的项目中有特定的命名约定 - 不需要像在源代码 json 中那样命名 classes 属性。对于 Newtonsoft.Json,您可以在序列化程序设置中使用 JsonPropertyAttribute or trying to setup corresponding NamingStrategy 标记属性(System.Text.Json 具有类似的选项)。