1. 动态字段序列化与反序列化实战指南
在Java开发中,我们经常需要处理JSON数据的序列化和反序列化。但有一种特殊场景让不少开发者头疼:当数据对象中既包含固定字段又包含动态字段时,如何优雅地实现JSON的转换?本文将深入探讨这个问题的解决方案,并提供两种主流JSON库(fastjson2和Jackson)的具体实现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题背景与核心需求
2.1 典型业务场景
假设我们正在开发一个基于Elasticsearch的数据存储系统,其中数据对象通常包含两类字段:
- 静态字段:固定字段名和固定含义,如用户ID、姓名等
- 动态字段:运行时动态添加的字段,存储在Map结构中
2.2 核心需求解析
我们需要实现以下两个关键功能:
- 序列化时:将Map内部的键值对提取出来,与静态字段平级存储
- 反序列化时:将平级的动态字段重新收集到Map中
这种需求在以下场景特别常见:
- 用户自定义属性
- 动态扩展的业务数据
- 不确定结构的元数据存储
3. fastjson2实现方案
3.1 环境准备与依赖配置
首先确保使用fastjson2而非旧版fastjson:
xml复制<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.39</version>
</dependency>
注意:本文基于fastjson2 2.0.39版本,其他版本可能需要调整实现方式
3.2 基础数据类定义
我们先定义一个包含静态字段和动态字段的简单数据类:
java复制@Data
public class Stuff {
private Integer id;
private String name;
private Map<String, Object> attrs = new HashMap<>();
}
3.3 初始实现的问题
使用基础实现进行测试:
java复制public class FastJsonUnwrapTest {
public static void main(String[] args) {
Stuff stuff = new Stuff();
stuff.setId(1001);
stuff.setName("在爪洼山玩泥巴");
stuff.putAttr("skill", Arrays.asList("Java", "MySQL", "es", "Flink"));
stuff.putAttr("level", 8);
String json = JSON.toJSONString(stuff);
S
