序列化和反序列化

注意

后端项目如果要求序列化为中文,可以考虑修改设计方案。

对外接口,包括大模型,一定要加异常输出日志,并添加兜底方案,方便排查问题。

大模型序列化

本文内容以 FastJson 为例说明

背景

在传统对外开发中,一般只针对外部接口,获取到对应的 xml 文件 或者 json,根据属性转化为对象,然后把对象的属性落库,常用 FastJson ,基础的使用如下链接所示:

一文搞定—FastJson详解 与 使用-CSDN博客

在调用大模型进行输入输出的过程中,反序列化成对象时会进行 中文key 转 英文key,设置 @JSONField(name = "一、案例描述") ,注解为中文,在反序列化成对象时确实会成为 英文 key;但是序列化为 字符串后落库时,会落中文 key。因此为了使 文本json 的 反序列化对象 的 序列化json 为英文key,可以使用 alternateNames 注解,该注解相当于取了别名,可以同时允许中英文 key 的序列化;部分中文key,部分英文key 也可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package org.muyi.dto.meeting;

import com.alibaba.fastjson.annotation.JSONField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
public class CustomerAnalysisReport {

@JSONField(alternateNames = "一、案例描述")
@ApiModelProperty(value = "案例描述")
private CaseDescription caseDescription;

@JSONField(alternateNames = "二、有效提问")
@ApiModelProperty(value = "有效提问")
private EffectiveQuestioning effectiveQuestioning;

@JSONField(alternateNames = "三、需求分析")
@ApiModelProperty(value = "需求分析")
private NeedsAnalysis needsAnalysis;

@JSONField(alternateNames = "四、建议方案")
@ApiModelProperty(value = "建议方案")
private SuggestedPlan suggestedPlan;

@JSONField(alternateNames = "五、沟通策略")
@ApiModelProperty(value = "沟通策略")
private CommunicationStrategy communicationStrategy;
}

特殊情况

如果不涉及到对象的嵌套,即只有一层属性,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package org.muyi.dto.meeting;

import com.alibaba.fastjson.annotation.JSONField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
public class FamilySituation {

@JSONField(name = "家庭财富决策权")
@ApiModelProperty(value = "家庭财富决策权")
private String familyWealthDecision;

@JSONField(name = "婚姻情况")
@ApiModelProperty(value = "婚姻情况")
private String marriage;

@JSONField(name = "婚姻情况(情感情况/有无多段婚姻/婚内财产安排)")
@ApiModelProperty(value = "婚姻情况详情")
private String marriageremark;

@JSONField(name = "配偶情况(年龄、职业、经济地位)")
@ApiModelProperty(value = "配偶情况")
private String spouseRemark;
}

可以使用以下两种方式来直接将 Java Bean 对象转为 Map,然后再序列化就不会有使用注解转为中文key 的问题

1
2
3
4
5
6
7
8
9
// 直接使用 hutool 工具类将对象转为 map
Map<String, Object> map = BeanUtil.beanToMap(familySituation);

// 间接转为 map
Map<String,Object> map =
JSON.parseObject(
JSON.toJSONString(bean),
Map.class
);

常用命令

1
2
3
4
5
6
7
8
9
// 序列化
String jsonString = JSON.toJSONString(user);


// 反序列化
// 单个对象
User user = JSON.parseObject(json, User.class);
// 对象列表
List<User> users = JSON.parseArray(jsonString, User.class);