jsonb 为什么会影响 System.Text.Json
我在将一个属性映射到 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的更多相关文章
- [译]试用新的System.Text.Json API
译注 可能有的小伙伴已经知道了,在.NET Core 3.0中微软加入了对JSON的内置支持. 一直以来.NET开发者们已经习惯使用Json.NET这个强大的库来处理JSON. 那么.NET为什么要增 ...
- [.Net Core 3.0+/.Net 5] System.Text.Json中时间格式化
简介 .Net Core 3.0开始全新推出了一个名为System.Text.Json的Json解析库,用于序列化和反序列化Json,此库的设计是为了取代Json.Net(Newtonsoft.Jso ...
- 【译】System.Text.Json 的下一步是什么
.NET 5.0 最近发布了,并带来了许多新特性和性能改进.System.Text.Json 也不例外.我们改进了性能和可靠性,并使熟悉 Newtonsoft.Json 的人更容易采用它.在这篇文章中 ...
- 使用System.Text.Json处理Json文档以及部分坑
System.Text.Json处理Json文档需要用到JsonDocument,JsonElement,JsonProperty. JsonDocument就是一个表示Json文档的东西,JsonE ...
- 在.Net Core 3.0中尝试新的System.Text.Json API
.NET Core 3.0提供了一个名为System.Text.Json的全新命名空间,它支持reader/writer,文档对象模型(DOM)和序列化程序.在此博客文章中,我将介绍它如何工作以及如何 ...
- .netcore3.0 System.Text.Json 日期格式化
.netcore3.0 的json格式化不再默认使用Newtonsoft.Json,而是使用自带的System.Text.Json来处理. 理由是System.Text.Json 依赖更少,效率更高. ...
- 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 ...
- 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 ...
- .NET Core 内置的 System.Text.Json 使用注意
System.Text.Json 是 .NET Core 3.0 新引入的高性能 json 解析.序列化.反序列化类库,武功高强,但毕竟初入江湖,炉火还没纯青,使用时需要注意,以下是我们在实现使用中遇 ...
- Net core 2.x 升级 3.0 使用自带 System.Text.Json 时区 踩坑经历
.Net Core 3.0 更新的东西很多,这里就不多做解释了,官方和博园大佬写得很详细 关于 Net Core 时区问题,在 2.1 版本的时候,因为用的是 Newtonsoft.Json,配置比较 ...
随机推荐
- RabbitMQ队列和消息的优先级
RabbitMQ队列和消息的优先级 如果队列中的消息很多,需要一部分消息被优先消费,这是可以通过为消息和队列设置优先级来实现. 请注意,消息的优先级是相对于队列的优先级而言的.如果队列的最大优先级是1 ...
- 点赞背后的技术大冒险:分布式事务与SAGA模式
title: 点赞背后的技术大冒险:分布式事务与SAGA模式 date: 2025/05/07 00:12:40 updated: 2025/05/07 00:12:40 author: cmdrag ...
- 如何清理误提交到git的历史大文件?
前言 哈喽!好久不见~ 最近在思考转型的事情,好久没有更新文章了 不过看到我之前开发的视频剪辑工具 Clipify 收获了不少 star ,让我想起之前画的饼似乎才实现了一点点,所以利用了周末的空闲时 ...
- ESP32 MQTT对接巴法云平台
ESP32 MQTT对接巴法云平台 MQTT(Message Queuing Telemetry Transport)是一种轻量级的 发布/订阅(Publish/Subscribe) 消息传输协议,专 ...
- Seata源码—1.Seata分布式事务的模式简介
大纲 1.Seata分布式事务框架简介 2.Seata AT模式实现分布式事务的机制 3.Seata AT模式下的写隔离机制 4.Seata AT模式下的读隔离机制 5.官网示例说明Seata AT模 ...
- 异步之舞:Motor驱动与MongoDB的CRUD交响曲
title: 异步之舞:Motor驱动与MongoDB的CRUD交响曲 date: 2025/05/19 15:30:10 updated: 2025/05/19 15:30:10 author: c ...
- qt动画类学习
Qt动画类 QPropertyAnimation 显示动画 QPropertyAnimation *animation = new QPropertyAnimation(window(), " ...
- .NET 开源工业视觉系统 OpenIVS 快速搭建自动化检测平台
前言 随着工业4.0和智能制造的发展,工业视觉在质检.定位.识别等场景中发挥着越来越重要的作用.然而,开发一个完整的工业视觉系统往往需要集成相机控制.图像采集.图像处理.AI推理.PLC通信等多个模块 ...
- 「Log」2023.8.28 小记
序幕 七点多到校,整理博客,开了一篇新做题记录. 整理一下学过知识点,准备阶段复习. 八点整开始打模拟赛,接下来算游记. T1 是个静态区间第 \(k\) 小板子,纯主席树被空间卡掉了,打了 \(60 ...
- Rtpengine 全面指南 (mr13.1.1.6):启动参数、配置详解及双网卡SBC部署实例
引言 本文档旨在为 rtpengine (版本 mr13.1.1.6) 用户提供一份详尽的参考指南.内容涵盖 rtpengine 的进程启动参数.rtpengine.conf 配置文件的主要参数说明, ...