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

[JsonDerivedType(typeof(DerivedClass), typeDiscriminator: "derived")]
public class BaseClass
{
public BaseClass() { }
}
public class DerivedClass : BaseClass
{
....
}

  当持久化数据后,我可能得到这样的数据:

{
"$type": "derived",
...
}

  或

{
"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 的多态反序列化限制

  当使用 [JsonDerivedType] 时,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 };

  如果您没有找到该属性,请升级到高版本。

jsonb 为什么会影响 System.Text.Json的更多相关文章

  1. [译]试用新的System.Text.Json API

    译注 可能有的小伙伴已经知道了,在.NET Core 3.0中微软加入了对JSON的内置支持. 一直以来.NET开发者们已经习惯使用Json.NET这个强大的库来处理JSON. 那么.NET为什么要增 ...

  2. [.Net Core 3.0+/.Net 5] System.Text.Json中时间格式化

    简介 .Net Core 3.0开始全新推出了一个名为System.Text.Json的Json解析库,用于序列化和反序列化Json,此库的设计是为了取代Json.Net(Newtonsoft.Jso ...

  3. 【译】System.Text.Json 的下一步是什么

    .NET 5.0 最近发布了,并带来了许多新特性和性能改进.System.Text.Json 也不例外.我们改进了性能和可靠性,并使熟悉 Newtonsoft.Json 的人更容易采用它.在这篇文章中 ...

  4. 使用System.Text.Json处理Json文档以及部分坑

    System.Text.Json处理Json文档需要用到JsonDocument,JsonElement,JsonProperty. JsonDocument就是一个表示Json文档的东西,JsonE ...

  5. 在.Net Core 3.0中尝试新的System.Text.Json API

    .NET Core 3.0提供了一个名为System.Text.Json的全新命名空间,它支持reader/writer,文档对象模型(DOM)和序列化程序.在此博客文章中,我将介绍它如何工作以及如何 ...

  6. .netcore3.0 System.Text.Json 日期格式化

    .netcore3.0 的json格式化不再默认使用Newtonsoft.Json,而是使用自带的System.Text.Json来处理. 理由是System.Text.Json 依赖更少,效率更高. ...

  7. In .net 4.8,calculate the time cost of serialization in BinaryFormatter,NewtonSoft.json,and System.Text.Json.JsonSerializer.Serialize

    using ConsoleApp390.Model; using Newtonsoft.Json; using System; using System.Collections.Generic; us ...

  8. C# Serialization performance in System.Runtime.Serialization.Formatters.Binary.BinaryFormatter,Newtonsoft.Json.JsonConvert and System.Text.Json.JsonSerializer.Serialize

    In .net core 3.0 using System;using System.Collections.Generic;using System.Collections;using System ...

  9. .NET Core 内置的 System.Text.Json 使用注意

    System.Text.Json 是 .NET Core 3.0 新引入的高性能 json 解析.序列化.反序列化类库,武功高强,但毕竟初入江湖,炉火还没纯青,使用时需要注意,以下是我们在实现使用中遇 ...

  10. Net core 2.x 升级 3.0 使用自带 System.Text.Json 时区 踩坑经历

    .Net Core 3.0 更新的东西很多,这里就不多做解释了,官方和博园大佬写得很详细 关于 Net Core 时区问题,在 2.1 版本的时候,因为用的是 Newtonsoft.Json,配置比较 ...

随机推荐

  1. Oracle ACL (Access Control List) 详细介绍

    参考:https://blog.csdn.net/qq243348167/article/details/87876956 --查询acl信息 SELECT * FROM dba_network_ac ...

  2. 通用的servlet

    1 通用的servlet实现的原理 2 实例 2.1 目录结构 2.2 BaseServlet.java 2.3 ServletDemo.java 2.4 index.html 2.5 test.ht ...

  3. MyCAT 2实现mysql8主从同步读写分离

    一.MyCAT2介绍 1.1 什么是MyCAT?MyCAT是目前最流行的分布式数据库中间插件,是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器.前端用户可以把它看作一个数据库代理,用M ...

  4. C#之System.Text.Json的用法

    System.Text.Json 是 C# 中的一个 JSON 序列化和反序列化库,它在 .NET Core 3.0 及更高版本中提供了内置支持.以下是 System.Text.Json 的用法详解: ...

  5. Ai数学基础

    数学基础 1.梯度 1.1偏导数 1.1.1定义 1.1.2几何意义 1.2方向导数 1.2.1定义 1.2.2定理 注:主要运用上面那个公式来计算! 1.3梯度的概念 注:gradf 表示梯度! 1 ...

  6. 按下 F12 打开开发者工具,它凭什么能监控所有网络请求?

    兄弟们,咱们天天跟浏览器打交道,F12 可能比键盘上其他任何一个功能键按得都多.我们习惯了在 Network 面板里看着请求瀑布流,调试 API,分析性能. 但你有没有停下来,哪怕一次,问过自己一个问 ...

  7. 开源技术交流丨ChengYing部署Hadoop集群实战

    一.直播介绍 上期雅泽同学对ChengYing是什么.有什么样的功能特性,如何快速入门做了介绍,本期海洋同学将会为大家分享ChengYing部署Hadoop集群实战的相关内容,欢迎大家积极参与. 二. ...

  8. 《为什么网站必须部署SSL证书?这几点你一定要知道》

    引言:一个真实案例带来的警示 某电商网站运营了两年多,一直没部署SSL证书.直到有一天,用户开始反馈"网站不安全",浏览器直接弹出警告页面,导致访问量骤降,订单几乎归零. 后来他们 ...

  9. 数栈 × AWS EMR On EC2 适配实践:打造出海企业可落地的云上数据中台解决方案

    随着袋鼠云全面推进数栈产品的出海战略,我们在服务多个头部出海客户的过程中发现,真正做好"海外可用"的数据平台,关键不仅在于部署全球化,还在于深入适配 AWS 的核心计算平台EMR, ...

  10. 下一代 2D 图像设计工具「GitHub 热点速览」

    长期以来,2D 设计领域似乎已是 Adobe 与 Figma 的天下,层叠的图层.熟悉的工具栏,一切都显得那么顺理成章,却也让不少设计师在创意的边界上感到了些许乏力.当我们以为设计工具的革新只能是小修 ...