序列化和反序列化
注意
后端项目如果要求序列化为中文,可以考虑修改设计方案。
对外接口,包括大模型,一定要加异常输出日志,并添加兜底方案,方便排查问题。
大模型序列化
本文内容以 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
| Map<String, Object> map = BeanUtil.beanToMap(familySituation);
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);
|