如何将 jsonb 字段中的字段名称映射到对象中的另一个名称?

How to map fields name in jsonb field to another name in object?

我使用 Postgres,我的数据库 table 看起来像那样

column - foo
type - jsonb
value - {"baz" : "test" }

请注意“baz”没有大写(这个 json 文档几乎是驼峰式)。

我有 C# 代码(所以命名约定是 Pascal Case)

public class Foo
{
     [Column(TypeName = "jsonb")]
     public BarData Bar { get; set; }
}

public class BarData
{
   // ??? What kind of annotation to put here
   public String Baz { get; set; }
}

我使用 entity framework + npgsql 到 read/write 到 DB。不幸的是,当 npgsql 从数据库读取时,它不会填充 Baz(因为命名约定不匹配)

a) 我尝试使用 [Column("baz")]。然而,它被忽略了(可能因为它不是真正的列,而是一个 json 标签)

b) 我正在考虑将 属性 命名为“baz”,但它只是将问题转移到代码中的另一个地方(需要进行另一个映射的地方)。

因此,我正在查看我是否错过了某种不区分大小写或将 属性 映射到来自 json.

的名称的方法

npgsql 驱动程序使用 System.Text.Json 序列化 json 值。所以你只需要用 JsonPropertyName 属性注释你的 属性。

public class BarData
{
   [JsonPropertyName("baz")]
   public String Baz { get; set; }
}

如果您唯一关心的是大小写,您可以使用 JsonSerializerSettings.PropertyNamingPolicy

这是从 6.0 版开始更改序列化选项的方式:

var options = new JsonSerializerOptions
{
    // Customize based on needs...
};
NpgsqlConnection.GlobalTypeMapper.AddTypeResolverFactory(new JsonOverrideTypeHandlerResolverFactory(options));

致谢 github answer

另外值得一提的是,第二种解决方法不会影响查询生成。