【问题标题】:Handling a Dictionary of primitive types in a Postgres JSONB column in ASP.NET Core在 ASP.NET Core 的 Postgres JSONB 列中处理原始类型字典
【发布时间】:2021-07-20 11:32:21
【问题描述】:

我在 Postgres 中有一个 JSONB 列,其中包含一个字典,其中的字符串键和值可以是字符串或数字。所以一个例子如下:

{
    "test": "string",
    "test2": 123,
    "test3": 7.2
}

如果我将其作为Dictionary<string, object> 放在 EF Core 模型上,我可以将其保存在数据库中而不会出现问题,一切都会自动运行。但如果我检索它,默认情况下 Newtonsoft JSON 不会将其序列化为有用的东西,我只会得到一些 ValueKind 属性并且缺少实际值:

  {
    "test": {
      "valueKind": 3
    },
    "test2": {
      "valueKind": 4
    },
    "test3": {
      "valueKind": 4
    }
  }

我怀疑我必须为此编写一个自定义序列化程序,但我认为这样的事情在 Web API 中很常见,因此会有更方便的方法。但到目前为止,我找不到任何可以修复此转换的设置。

有没有办法让 ASP.NET 和 Newtonsoft 将 JSONB 列序列化回我放入的那种格式?哪些键是数字,哪些是字符串的信息仍然在 JSON 中,所以在这里输出一些合理的东西应该不需要我的帮助。

或者,有没有比Dictionary<string, object>更好的方法来处理这种数据?

【问题讨论】:

标签: c# asp.net-core entity-framework-core json.net


【解决方案1】:

这个问题似乎是由混合 JSON 库引起的。 EF Core 默认使用 system.text.json,因此如果您在 ASP.NET Core 中启用 Newtonsoft,则这种情况下的数据将通过两个不同的库传递。

将其切换为仅 system.text.json 可解决问题,Dictionary<string, object> 会自动序列化,如您所料。

【讨论】:

    猜你喜欢
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 2019-12-04
    • 2019-10-06
    • 2020-08-15
    • 2017-06-19
    • 2018-02-10
    相关资源
    最近更新 更多