system.text.json是.net core 3.0+及.net 5+内置高性能json库,性能优于newtonsoft.json,支持原生utf-8、零分配解析(jsondocument/jsonelement),但默认不支持循环引用和动态类型,需手动配置选项或使用自定义转换器。

直接用 System.Text.Json,不用装第三方包,.NET Core 3.0+ 和 .NET 5+ 默认自带,性能比 Newtonsoft.Json 更高,但默认不支持循环引用和部分老习惯(比如无参构造函数非必需)。
序列化对象为 JSON 字符串:用 JsonSerializer.Serialize
最常用场景:把 C# 对象转成 API 响应体、写入文件或发给前端。
- 基本调用就是
JsonSerializer.Serialize(obj),返回紧凑格式字符串;加new JsonSerializerOptions { WriteIndented = true }可美化输出 - 默认只序列化 public get/set 属性,private 字段、只读属性(
getonly)、init属性需显式启用:设IncludeFields = true或用[JsonPropertyName]/[JsonIgnore]控制 - 日期默认输出 ISO 8601 格式(如
"2026-05-07T05:12:00Z"),要改格式得自定义JsonConverter<datetime></datetime>,不能靠字符串替换 - 如果对象里有
null值,默认会保留字段;想跳过空值,设DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
反序列化 JSON 字符串为对象:用 JsonSerializer.Deserialize<t></t>
典型用途:解析 HTTP 请求 Body、读配置文件、处理第三方接口返回。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 必须指定泛型类型
T,比如JsonSerializer.Deserialize<user>(json)</user>;传object或dynamic会失败或丢失类型信息 - JSON 字段名跟 C# 属性名不一致时,用
[JsonPropertyName("api_user_name")]标记属性,否则默认按 PascalCase 映射 - 遇到缺失字段,只要属性是可空类型(
int?、string)或有默认值,就不会报错;但若 JSON 有字段而类里没对应属性,默认直接忽略(不会抛异常) - 反序列化集合时,
JsonSerializer.Deserialize<list>>(json)</list>没问题,但别写成Deserialize<ilist>></ilist>—— 接口类型不支持,得用具体实现类
处理常见错误:JsonException 怎么定位和绕过
运行时报 JsonException 是最常卡住的地方,不是语法错,而是类型/结构不匹配。
- 典型错误信息像:
Cannot convert object to type 'System.Int32',说明 JSON 里该字段是字符串("123"),但 C# 属性是int;要么改 JSON,要么加转换器(JsonConverter<int></int>) - 嵌套对象为空对象
{},但目标类型没有无参构造函数 → 报错;解决:加public User() { },或用JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase配合命名策略 - JSON 里有注释、尾随逗号、单引号 ——
System.Text.Json严格遵循标准,全都不认;必须提前清理,不能靠选项开关 - 调试时建议先用
JsonDocument.Parse(json)手动检查结构,再决定怎么映射,比盲猜Deserialize快得多
和 Newtonsoft.Json 的关键差异点
如果你从 Newtonsoft 迁移过来,这几个行为差异最容易踩坑:
-
JsonSerializer默认不支持循环引用(ReferenceHandler.Preserve要手动开启,且只限于 .NET 6+) - Newtonsoft 默认把
DateTime当本地时间处理,System.Text.Json默认当 UTC;传时间字段前务必确认时区含义 - Newtonsoft 允许反序列化到
ExpandoObject或JObject做动态解析,System.Text.Json对应的是JsonElement/JsonDocument,API 风格更底层、更啰嗦但更可控 - 自定义 converter 写法不同:Newtonsoft 用
JsonConverter抽象类,System.Text.Json用JsonConverter<t></t>泛型类,且必须重写Read/Write两个方法
真正难的不是写对第一行 Serialize,而是当 JSON 结构不规范、字段类型飘忽、历史数据混杂时,如何让 Deserialize 不崩——这时候别硬扛,先用 JsonElement 做分步解析,再喂给强类型对象。










