JSON 处理

共 18 题
📑 题目列表 18 题
#
★★★

1. JSON Schema(Draft 2020-12)的工程价值

JSON Schema(Draft 2020-12)的工程价值是什么?

  • JSON Schema
  • 校验
  • 工程价值

JSON Schema(Draft 2020-12)用于描述 JSON 数据结构并校验实例。工程价值:作为 JSON 数据的契约,校验请求/响应是否符合规范(类型、必填、格式、枚举、范围);作为 API 契约的一部分(OpenAPI 3.1 采用 JSON Schema);驱动代码生成与文档;支持数据校验(服务端/客户端统一校验)。Draft 2020-12 是当前主版本,支持 $defs、prefixItems、unevaluatedProperties 等。价值在于"结构契约 + 校验 + 文档/代码生成",提升数据一致性与接口质量。

JSON Schema 是 JSON 数据的契约与校验工具,支持类型、格式、约束校验。是 API 契约与数据校验的基础。

#
★★★

2. Jackson 在 Spring Boot 的默认与 BOM

Jackson 在 Spring Boot 的默认与 BOM 是什么?

  • Jackson 默认
  • BOM 管理
  • 版本

Spring Boot 默认使用 Jackson 作为 JSON 序列化/反序列化库(spring-boot-starter-json 引入 jackson-databind、jackson-core、jackson-annotations、jackson-datatype-jsr310 等)。Spring Boot 通过 BOM(Bill of Materials,spring-boot-dependencies)管理 Jackson 版本,保证各模块版本一致且兼容。Spring Boot 自动配置 ObjectMapper(已注册 JavaTimeModule、常用模块),提供自定义扩展点(Jackson2ObjectMapperBuilderCustomizer)。BOM 让 Jackson 版本与 Spring Boot 版本对齐,避免版本冲突。使用 Spring Boot 时无需手动管理 Jackson 版本,由 BOM 统一。

Spring Boot 默认集成 Jackson,用 BOM 统一管理版本,自动配置 ObjectMapper。版本由 boot 管理,避免冲突。

#
★★★

3. Jackson 的 JavaTimeModule 在日期时间序列化时时区处理有哪些陷阱,WRITE_DATES_AS_TIMESTAMPS 与 ISO 字符串格式如何影响跨端一致性

Jackson 的 JavaTimeModule 在日期时间序列化时时区处理有哪些陷阱?WRITE_DATES_AS_TIMESTAMPS 与 ISO 字符串格式如何影响跨端一致性?

  • JavaTimeModule
  • 时区陷阱
  • 时间戳/ISO 格式

Jackson 的 JavaTimeModule 支持 java.time 类型(LocalDateTime、Instant、ZonedDateTime)。时区陷阱:LocalDateTime 无时区,反序列化时若不指定时区可能按默认时区解释;Instant/ZonedDateTime 涉及时区,若序列化/反序列化时区不一致,跨端时间错乱。WRITE_DATES_AS_TIMESTAMPS:默认启用时把日期序列化为数值时间戳(如数组),不启用时序列化为 ISO-8601 字符串。跨端一致性:推荐禁用 WRITE_DATES_AS_TIMESTAMPS(用 ISO 字符串),比时间戳可读、时区信息明确、跨语言一致;时间戳依赖时区换算易错。需统一时区(如 UTC)并配置 JavaTimeModule 的时区处理。

时区陷阱源于 LocalDateTime 无时区与默认时区差异。ISO 字符串(禁时间戳)比时间戳更清晰、跨端一致,需统一时区。

#
★★★

4. Jackson 多态反序列化(default typing/@JsonTypeInfo)的历史漏洞如何产生,enableDefaultTyping 为何被弃用、安全配置如何收敛白名单

Jackson 多态反序列化(default typing/@JsonTypeInfo)的历史漏洞如何产生?enableDefaultTyping 为何被弃用?安全配置如何收敛白名单?

  • 多态反序列化
  • 反序列化漏洞
  • 白名单收敛

Jackson 多态反序列化(default typing、@JsonTypeInfo)在反序列化时根据类型信息实例化具体类,若类型信息来自不可信输入,攻击者可构造恶意类(如 gadget 链)触发反序列化漏洞(RCE)。历史漏洞源于 enableDefaultTyping 允许任意类型实例化,攻击者利用类型信息加载恶意类。enableDefaultTyping 被弃用:其默认允许任意类型,不安全。安全配置收敛白名单:用 activateDefaultTyping 配合多态白名单(PolymorphicTypeValidator)限制允许反序列化的类型;或关闭 default typing,用 @JsonTypeInfo 显式限定子类型;用 validate 白名单禁止未知类型。收敛白名单是不允许任意类型实例化。

漏洞源于"任意类型可实例化"。弃用 enableDefaultTyping,用 PolymorphicTypeValidator 白名单或限定子类型,收敛到安全类型集合。

#
★★

5. Jackson 的 ObjectMapper 在 Spring Boot 3.5+ 的自定义配置

Jackson 的 ObjectMapper 在 Spring Boot 3.5+ 的自定义配置是什么?

  • ObjectMapper 自定义
  • Spring Boot 集成
  • 配置方式

Spring Boot 3.5+ 中自定义 ObjectMapper:用 Jackson2ObjectMapperBuilderCustomizer 或自定义 ObjectMapper bean 覆盖默认配置。配置项:注册模块(JavaTimeModule、自定义模块)、配置序列化特性(如禁用 WRITE_DATES_AS_TIMESTAMPS、FAIL_ON_UNKNOWN_PROPERTIES)、设置属性命名策略、注册自定义序列化器/反序列化器。Spring Boot 提供自动配置的 ObjectMapper,通过 Customizer 在自动配置基础上调整,避免完全替换。3.5+ 支持更细的定制(如 Jackson 3 迁移路径)。自定义需保证与 Spring Boot 的 MVC/消息转换集成一致。

用 Jackson2ObjectMapperBuilderCustomizer 在自动配置基础上定制 ObjectMapper,配置模块、特性、命名策略等,保证集成。

#
★★

6. com.alibaba.fastjson2 在 Spring Boot 的替换路径

com.alibaba.fastjson2 在 Spring Boot 的替换路径是什么?

  • fastjson2
  • 替换 Jackson
  • 集成路径

用 fastjson2 替换 Spring Boot 默认的 Jackson:引入 fastjson2 依赖(fastjson2 或 fastjson2-extension-spring),配置 HttpMessageConverter 用 fastjson2 的 JSON 转换器(FastJsonHttpMessageConverter),替换 MVC 的 Jackson 转换器;同时配置 ObjectMapper/序列化。替换路径:排除 Jackson 依赖、注册 fastjson2 的 message converter、配置序列化特性。注意兼容性:fastjson2 与 Spring Boot 集成需符合 Spring 的 HttpMessageConverter 机制,且可能影响其他依赖 Jackson 的组件。也可同时保留两者(按需用)。替换需验证序列化行为与安全配置。

替换路径是"引入 fastjson2 + 注册 FastJsonHttpMessageConverter 替换 Jackson 转换器"。注意兼容与安全配置。

#
★★

7. Fastjson2(阿里)在 JDK 25 与 Spring Boot 3.5+ 的兼容性与性能取舍

Fastjson2(阿里)在 JDK 25 与 Spring Boot 3.5+ 的兼容性与性能取舍是什么?

  • Fastjson2 兼容性
  • JDK 25
  • 性能取舍

Fastjson2 在 JDK 25 与 Spring Boot 3.5+ 的兼容性需验证:新 JDK 的模块系统、反射限制、新特性可能与 fastjson2 的序列化机制(反射、MethodHandle)有兼容问题;Spring Boot 3.5+ 的自动配置与 fastjson2 集成需版本匹配。性能取舍:fastjson2 以高性能著称(JSONB 二进制、优化序列化),但需评估与 Jackson 的差距是否值得替换;且 fastjson2 曾有安全漏洞历史,需用最新版本并配置安全。取舍是在性能提升与兼容性、安全、生态维护成本之间权衡。一般场景 Jackson 足够,fastjson2 用于极致性能。需实测与验证。

fastjson2 高性能但需验证 JDK 25/Boot 3.5+ 兼容性,且关注安全与生态。性能取舍需实测,安全配置不可省。

#
★★

8. Gson 的 @SerializedName 与 Jackson 的 @JsonProperty 在跨语言兼容性的工程价值

Gson 的 @SerializedName 与 Jackson 的 @JsonProperty 在跨语言兼容性的工程价值是什么?

  • @SerializedName
  • @JsonProperty
  • 跨语言兼容

Gson 的 @SerializedName 与 Jackson 的 @JsonProperty 都用于指定 Java 字段与 JSON 字段名的映射(可指定 JSON 中使用的字段名)。工程价值:跨语言兼容性——Java 字段名可能与 JSON 契约的其他语言字段名(如 snake_case、特定命名)不一致,用注解显式映射,保证 Java 对象与 JSON 报文字段名符合跨语言契约;也可用于字段名重命名、兼容多种字段名(@JsonProperty 的多个 alias)。这让 Java 侧保持命名习惯,同时 JSON 侧符合契约,实现跨语言一致。

@SerializedName/@JsonProperty 显式映射 Java 字段与 JSON 字段名,兼容跨语言命名契约,避免命名不一致。

#
★★

9. JSON Lines(.jsonl)的处理

JSON Lines(.jsonl)的处理如何实现?

  • JSON Lines
  • 逐行处理
  • 流式

JSON Lines(.jsonl)是每行一个 JSON 对象的格式,用换行分隔,适合流式/日志/大数据处理。处理:逐行读取(流式),每行解析为一个 JSON 对象;用流式读取器(如 BufferedReader 逐行 + JSON 解析器逐行解析)避免一次性加载全部。适合大文件、日志、增量处理,可并行或流式。Java 中用 BufferedReader.lines() 逐行 + Jackson/Fastjson 逐行解析,或流式 API。JSON Lines 的好处是每行独立、可追加、可流式解析,内存友好。

JSON Lines 逐行独立 JSON,用流式逐行读取解析,内存友好,适合日志/大数据/增量处理。

#
★★

10. JSON Merge Patch(RFC 7396)的工程价值

JSON Merge Patch(RFC 7396)的工程价值是什么?

  • JSON Merge Patch
  • RFC 7396
  • 部分更新

JSON Merge Patch(RFC 7396)定义部分更新 JSON 文档的格式:patch 是 JSON 对象,包含要修改的字段,null 表示删除字段,未包含的字段保持不变。用于 PATCH 请求的部分更新(只改需要改的字段),比 PUT 全量更高效。工程价值:实现部分更新语义、减少传输、与 REST PATCH 配合;语义简单(合并)。局限:无法表达数组的精确操作(只能整体替换)、无法表达 null 值作为有效值(null 表示删除)。适合简单对象的部分更新,复杂结构用 JSON Patch(RFC 6902)。

Merge Patch 用"包含改、null 删、未含不变"实现部分更新,适合简单对象 PATCH。局限在数组与 null 值语义。

#
★★

11. JSON Patch(RFC 6902)与 JsonPatch

JSON Patch(RFC 6902)与 JsonPatch 是什么?

  • JSON Patch
  • RFC 6902
  • 操作

JSON Patch(RFC 6902)定义对 JSON 文档的精确操作序列:add、remove、replace、move、copy、test,用 JSON Pointer 定位操作目标。可实现任意 JSON 文档的增量修改(含数组精确操作、嵌套)。JsonPatch 是 JSON Patch 的 Java 实现(Jackson 的 jayway JsonPath 或 jackson 生态),用于应用 patch 到 JSON 文档。工程价值:相比 Merge Patch,JSON Patch 支持数组精确操作(add/remove 指定索引)、null 值、条件操作(test),表达能力强。适合复杂结构的精确更新。代价是 patch 格式更复杂。

JSON Patch 用 add/remove/replace/move/copy/test 操作 + JSON Pointer 精确修改,支持数组与 null,表达力强。JsonPatch 是 Java 实现。

#
★★

12. JSON Pointer(RFC 6901)与 JsonNode.at()

JSON Pointer(RFC 6901)与 JsonNode.at() 是什么?

  • JSON Pointer
  • JsonNode.at()
  • 定位

JSON Pointer(RFC 6901)是定位 JSON 文档中特定值的字符串语法,如 /a/b/c 定位嵌套字段,/a/0 定位数组元素,用 ~ 转义特殊字符。JsonNode.at() 是 Jackson 的 TreeNode 方法,用 JSON Pointer 表达式定位并返回 JsonNode,找不到返回 MissingNode。工程价值:用指针表达式精确访问 JSON 嵌套/数组元素,避免逐层 get,表达简洁;at() 用于动态、按路径访问 JSON。配合 JSON Patch 的定位、动态配置路径访问。适合按路径提取 JSON 值。

JSON Pointer 用路径字符串定位 JSON 值,JsonNode.at() 按指针访问。简洁动态访问嵌套 JSON。

#
★★

13. JSON 的标准(RFC 8259)与 Java 实现的取舍

JSON 的标准(RFC 8259)与 Java 实现的取舍是什么?

  • RFC 8259
  • Java 实现
  • 取舍

JSON 标准(RFC 8259)定义 JSON 语法(对象、数组、字符串、数字、布尔、null)。Java 实现(Jackson、Gson、Fastjson、JSON-B)在标准基础上做取舍:由于 Java 类型与 JSON 类型不完全对应,实现需处理映射(如数字精度、日期、枚举、多态)、性能(databind vs 流式)、安全(注入、反序列化漏洞)、兼容性(特性差异)。取舍:标准保证语法一致,实现差异在"类型映射、性能、安全、扩展"。选型需考虑与标准一致、性能、生态、安全。RFC 8259 是 UTF-8 JSON 的规范基础。

RFC 8259 定语法,Java 实现取舍在类型映射、性能、安全、扩展。选型权衡标准一致性、性能与生态。

#
★★

14. Jackson 3.0(按官方生成时文档)在 Spring Boot 3.5+ 与 JDK 25 的新特性与向后兼容性

Jackson 3.0(按官方生成时文档)在 Spring Boot 3.5+ 与 JDK 25 的新特性与向后兼容性是什么?

  • Jackson 3.0
  • 新特性
  • 向后兼容

Jackson 3.0 是 Jackson 2 的下一代:包名可能变化(部分包迁移到 jackson 3 命名空间)、优化 API(如流式 API 增强)、模块系统改进、性能提升、支持新 JDK 特性。向后兼容性:Jackson 3.0 对 2.x 的 API 有破坏性变更(包名、部分 API 调整),2.x 代码迁移需适配;Spring Boot 3.5+ 对 Jackson 3 的集成需相应版本支持。新特性可能包括:改进的流式处理、新的序列化模型、对 JDK 24/25 特性的支持。选型需评估迁移成本与兼容性。以官方文档为准。

Jackson 3.0 有 API 破坏性变更与新特性,需迁移适配。Spring Boot 3.5+ 集成需版本匹配,按官方文档评估。

#
★★

15. Jackson 流式 API(JsonParser/JsonGenerator)如何以事件驱动方式处理超大 JSON,相比 databind 全量加载如何控制内存占用

Jackson 流式 API(JsonParser/JsonGenerator)如何以事件驱动方式处理超大 JSON?相比 databind 全量加载如何控制内存占用?

  • 流式 API
  • 事件驱动
  • 内存控制

Jackson 流式 API(JsonParser/JsonGenerator)以事件驱动方式处理 JSON:JsonParser 逐 token 读取(START_OBJECT、FIELD_NAME、VALUE_STRING 等),JsonGenerator 逐 token 写出,不一次性加载整个 JSON 到内存。相比 databind 全量加载(把整个 JSON 反序列化为 Java 对象树),流式只需处理当前 token,内存占用 O(1)(与 JSON 大小无关),适合超大 JSON(日志、流式大文件)。工程价值:流式处理超大 JSON 控制内存,避免 OOM;结合 JsonNode 可局部解析。取舍:流式需手写 token 处理,代码复杂;databind 简单但内存大。

流式 API 逐 token 事件驱动,内存 O(1),适合超大 JSON;databind 全量加载内存大。按数据大小与复杂度选。

#
★★

16. Jackson 的 @JsonView/@JsonFilter/@JsonInclude 在序列化过滤的工程价值

Jackson 的 @JsonView/@JsonFilter/@JsonInclude 在序列化过滤的工程价值是什么?

  • @JsonView
  • @JsonFilter
  • @JsonInclude

Jackson 的序列化过滤注解:@JsonView(定义视图,按视图控制序列化哪些字段,如简化视图/完整视图,用于不同接口返回不同字段集);@JsonFilter(自定义过滤器,按运行时条件过滤字段);@JsonInclude(控制 null/空值字段是否序列化,如 NON_NULL 跳过 null、NON_EMPTY 跳过空)。工程价值:按场景/接口控制返回字段(@JsonView 视图)、动态过滤(@JsonFilter)、控制 null 字段(@JsonInclude),减少不必要字段、控制响应体积与敏感字段。三者配合实现精细的序列化过滤。

@JsonView 按视图控制字段、@JsonFilter 动态过滤、@JsonInclude 控制 null/空。实现精细序列化过滤与响应控制。

#

17. jackson-module-jsonSchema 的工程应用

jackson-module-jsonSchema 的工程应用是什么?

  • jackson-module-jsonSchema
  • 生成 JSON Schema
  • 应用

jackson-module-jsonSchema 可根据 Java 类生成 JSON Schema(早期 Draft 4),用于描述 Java 对象对应的 JSON 结构。工程应用:从 Java POJO 生成 schema 作为契约(供文档、校验、前端生成);基于 schema 做数据校验;用于 OpenAPI/契约测试。局限:支持较旧 Draft 4,对复杂类型(多态、Java 8+ 特性)支持有限。应用场景:把 Java 模型转化为 JSON 契约,用于接口文档与校验。新方案可用 jackson 的 jsonSchema 生成器(支持更新 Draft)或手写 schema。

jackson-module-jsonSchema 从 Java 类生成 JSON Schema,用于契约文档与校验。局限在 Draft 4 与复杂类型支持。

#

18. javax.json/jakarta.json 的解析器

javax.json/jakarta.json 的解析器是什么?

  • javax.json/jakarta.json
  • JSON-P
  • 解析器

javax.json/jakarta.json(JSON-P,JSON Processing)是 Java EE/Jakarta EE 的 JSON 标准 API,提供对象模型(JsonObject/JsonArray 树)与流式(JsonParser/JsonGenerator)两种解析方式。jakarta.json 是 javax.json 的 Jakarta EE 迁移版本(包名从 javax.json 改为 jakarta.json)。解析器:Json.createReader 读对象模型、Json.createParser 流式解析、Json.createGenerator 流式生成。提供标准化的 JSON 处理 API,跨实现一致。相比 Jackson,JSON-P 更标准但功能较基础(无 databind 到 POJO 的自动映射,需手动映射)。

JSON-P 是 Java 标准 JSON API,提供对象模型与流式解析,jakarta.json 是迁移版。标准化但功能较基础。