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 属性进行排序,导致存储后的属性顺序与序列化时不同。
➡️