DEBUG.WIKI
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →
OnlineSIM:在线接收短信,虚拟号码租用
RackNerd;$21.99/年 · 1GB KVM

Npgsql 的 JsonNode[] 要求 EnableDynamicJson,先检查 10.0.2 映射缺口

单个 JsonNode 能写,JsonNode[] 却要求动态 JSON,并不一定是配置忘开。Npgsql 10.0.2 基础数组映射缺少基类,10.0.3 已补入。

单个 JsonNode 参数可以写入,换成 JsonNode[],并指定 NpgsqlDbType.Array | NpgsqlDbType.Jsonb 后,却提示 required dynamic JSON serialization,要求调用 EnableDynamicJson。在 Npgsql 10.0.2 中,这可能是基础数组映射缺口,不一定是应用忘记开启动态 JSON。

这个版本的单值基础映射包含 JsonNode,数组映射则列举了 JsonObject、JsonArray、JsonValue 等类型,却没有 JsonNode 基类。于是声明为 JsonObject[] 的值可走基础映射,相同元素放进 JsonNode[] 后可能走到动态映射提示。

先分清是 jsonb[] 还是一个 JSON 数组

JsonNode[] 配合 NpgsqlDbType.Array | NpgsqlDbType.Jsonb 表示 PostgreSQL 的 jsonb[]:每个 SQL 数组元素分别是一份 JSON。一个 JsonArray 配合 NpgsqlDbType.Jsonb 则是一份内部含数组的 JSON 文档。两者的 SQL 运算、NULL 语义和列类型都不同。

确认数据库列和参数原本需要哪种形状。不要为了绕过错误把 jsonb[] 改成 jsonb,也不要把 JSON 序列化成一个字符串后仍沿用数组参数类型。

优先验证补齐映射的正式版本

Npgsql 10.0.3 已在基础数组 resolver 中加入 JsonNode,并补上相关 JSON 类型元数据。保留依赖锁定,在项目兼容范围内升级到包含该修正的正式版本,再用同一参数声明验证。

检查运行期实际版本,尤其是外层框架或数据访问插件可能带入另一版 Npgsql。仅更新开发机缓存不能改变部署产物。

暂时保留 10.0.2 时,如果所有元素本来就必须是 JSON 对象,可在读取或构造边界明确使用 JsonObject[],并对意外的数组、标量和 null 做原有业务校验。不要对混合 JsonNode 数据直接强转,这会把驱动错误换成应用转换异常,也会缩小原有数据范围。

另一种途径是启用动态 JSON,但它改变了数据源映射能力,并且与 NativeAOT 兼容要求有关。应在明确需要该路径、核对部署方式后选择,不能把异常提示中的方法名无条件加到所有数据源上。

复查时覆盖空 SQL 数组、多个 JSON 元素、SQL NULL、JSON null,以及允许的不同 DOM 节点类型。读回后比较数组长度、元素内容和空值含义。确认没有把一个 SQL 数组变成单份 JSON 文档,才算完成类型边界的修复。