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

💡 原文中文,约1300字,阅读约需4分钟。
📝

内容提要

在将属性映射到 jsonb 类型时,System.Text.Json 要求类型鉴别器($type)必须是第一个属性,否则会抛出异常。由于 jsonb 存储会自动排序属性,建议将 JsonSerializerOptions 的 AllowOutOfOrderMetadataProperties 属性设置为 true 以解决此问题。

🎯

关键要点

  • 在将属性映射到 jsonb 类型时,$type 必须是第一个属性,否则会抛出异常。
  • 使用 [JsonDerivedType] 时,System.Text.Json 要求类型鉴别器必须在 json 中的首位。
  • jsonb 类型会自动对 json 属性进行排序,导致存储后的属性顺序与序列化时不同。
  • 解决方案是将 JsonSerializerOptions 的 AllowOutOfOrderMetadataProperties 属性设置为 true。
  • 如果找不到该属性,建议升级到高版本。

延伸问答

为什么在使用 System.Text.Json 时,$type 必须是第一个属性?

因为 System.Text.Json 要求类型鉴别器必须在 json 中的首位,否则会抛出异常。

如何解决 jsonb 类型导致的反序列化异常?

可以通过将 JsonSerializerOptions 的 AllowOutOfOrderMetadataProperties 属性设置为 true 来解决此问题。

json 和 jsonb 在存储上有什么区别?

json 以原始文本形式存储,而 jsonb 以二进制形式存储,会解析和规范化 json 数据。

如果找不到 AllowOutOfOrderMetadataProperties 属性该怎么办?

建议升级到高版本以获取该属性。

System.Text.Json 的多态反序列化有什么限制?

多态反序列化要求类型鉴别器必须是 json 中的第一个属性,否则会导致反序列化失败。

jsonb 类型如何影响属性的顺序?

jsonb 类型会自动对 json 属性进行排序,导致存储后的属性顺序与序列化时不同。

➡️

继续阅读