游瞠离 发表于 2025-7-23 14:18:15

jsonb 为什么会影响 System.Text.Json

  我在将一个属性映射到 jsonb 类型时遇到这样一个问题 —— 我有一个抽象基类 BaseClass 和一个派生类 DerivedClass:

public class BaseClass
{
    public BaseClass() { }
}
public class DerivedClass : BaseClass
{
    ....
}  当持久化数据后,我可能得到这样的数据:
{
"$type": "derived",
...
}<br>  或
{
"value": 131121,
"$type": "derived",
...
}  第一个 json 中,类型鉴别器($type)是 json 里的第一个属性;而第二个 json 字符串则不是这种情况。当我执行 Deserialize 方法时,第二个 json 字符串会抛出异常。
System.Text.Json.JsonException : The metadata property is either not supported by the type or is not the first property in the deserialized JSON object. Path: $.$type | LineNumber: 0 | BytePositionInLine: 47.问题原因

System.Text.Json 的多态反序列化限制

  当使用 时,System.Text.Json 要求类型鉴别器(如 $type)必须是 json 中的第一个属性。如果鉴别器不在首位,反序列化会失败并抛出异常。
PostgreSQL 的存储特性

  - json:以原始文本形式存储,完全保留输入的 json 字符串格式(包括空格、重复键、顺序等)。
  - jsonb:以二进制形式存储,会对 json 进行解析和规范化(例如去重键、忽略多余空格、重新排序键)。
  jsonb 类型会自动对 json 属性进行排序,导致存储后的属性顺序与序列化时不同。例如:{"$type":"derived","value": xxx } 存储到 jsonb 后可能变为:{"value": xxx ,"$type":"derived"} 这种顺序变化会引发 System.Text.Json 的异常。
解决方案

  其实微软在官方文档中已经给出了说明:

  通过设置 AllowOutOfOrderMetadataProperties 属性为 true,可解决此问题:
JsonSerializerOptions options = new() { AllowOutOfOrderMetadataProperties = true };  如果您没有找到该属性,请升级到高版本。

 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

蜴间囝 发表于 2025-10-19 19:04:16

收藏一下   不知道什么时候能用到

锟及 发表于 2025-10-26 00:45:57

喜欢鼓捣这些软件,现在用得少,谢谢分享!

齐娅晶 发表于 2025-11-20 06:03:01

用心讨论,共获提升!

鞍汉 发表于 2026-1-4 20:27:26

这个有用。

飧沾 发表于 2026-1-9 01:11:08

前排留名,哈哈哈

赘暨逢 发表于 2026-1-20 19:15:16

很好很强大我过来先占个楼 待编辑

系味 发表于 2026-1-22 20:31:14

鼓励转贴优秀软件安全工具和文档!

歇凛尾 发表于 2026-1-23 08:23:18

东西不错很实用谢谢分享

东郭欣然 发表于 2026-2-4 05:38:43

感谢分享,学习下。

褥师此 发表于 2026-2-5 04:01:56

热心回复!

当贵 发表于 2026-2-8 05:08:17

懂技术并乐意极积无私分享的人越来越少。珍惜

届表 发表于 2026-2-9 01:34:35

分享、互助 让互联网精神温暖你我

利怡悦 发表于 2026-2-9 22:48:04

分享、互助 让互联网精神温暖你我

松菊 发表于 2026-2-10 23:26:39

鼓励转贴优秀软件安全工具和文档!

神泱 发表于 2026-2-11 20:58:32

感谢,下载保存了

莠畅缕 发表于 2026-2-12 10:47:10

东西不错很实用谢谢分享

余思洁 发表于 2026-2-14 03:58:13

很好很强大我过来先占个楼 待编辑

缢闸 发表于 2026-2-17 13:13:52

热心回复!

左丘平莹 发表于 2026-2-24 16:55:05

谢谢楼主提供!
页: [1] 2
查看完整版本: jsonb 为什么会影响 System.Text.Json