fastjson反序列化时_id的处理
写程序时,借助fastjson,将map对象转为json字符串,然后再通过json字符串转为对应的java对象
Map<String, Object> map = value.asMap();String jsonString = JSON.toJSONString(map);System.out.println(jsonString);UserRealtion userRealtion = JSON.parseObject(jsonString, UserRealtion.class);
map转的json字符串如下
{"_type":"User","name":"lisi","_id":0,"id":1,"invite":[{"_type":"User","name":"wangwu","_id":77,"id":4,"invite":[{"_type":"User","name":"laoren","_id":43,"id":6}]},
转为java对象后,打印内容如下:
UserRealtion(id=0, name=lisi, invite=[UserRealtion(id=77, name=wangwu, invite=[UserRealtion(id=43, name=laoren, invite=null)]), UserRealtion(id=23, name=zhaosi, invite=null)])
从输出看到,json字符串的_id转为了java对象属性的id,这不是想要的结果。于是,修改java对象,使用了@JSONField(alternateNames = {"id"})属性
package com.qfedu.microuser.user.service;import lombok.Data;import java.util.List;/*** @Classname UserRealtion* @Description TODO* @Date 2025-07-29 16:00* @Created by 老任与码*/
@Data
public class UserRealtion {// 父节点// @JSONField(name = "_id", alternateNames = {"id"})@JSONField(alternateNames = {"id"}) //不行private Integer id;private String name;// 子节点List<UserRealtion> invite;
}
结果转换后,结果还是不对,上网查了资料,当一个json存在id 和_id 的时候,使用JSONObject.parseObject进行序列号操作,映射错误_jsonobject.parseobject映射不上去-CSDN博客
这篇文章中也提到了这个问题,于是使用 @JSONField(name = "_id", alternateNames = {"id"})注解
package com.qfedu.microuser.user.service;import lombok.Data;import java.util.List;/*** @Classname UserRealtion* @Description TODO* @Date 2025-07-29 16:00* @Created by 老任与码*/
@Data
public class UserRealtion {// 父节点@JSONField(name = "_id", alternateNames = {"id"})private Integer id;private String name;// 子节点List<UserRealtion> invite;
}
转换后结果如下
UserRealtion(id=1, name=lisi, invite=[UserRealtion(id=4, name=wangwu, invite=[UserRealtion(id=6, name=laoren, invite=null)]), UserRealtion(id=5, name=zhaosi, invite=null)])
可以看到,结果正确。
但是不太明白为什么name和alternateNames要一起指定,哪位大佬知道原因,还请告知一下。