场景:
最近因为公司的一个业务在不同环境下不同的展示,PC端和移动端,两种不同的展示效果导致了在一段JSON字符串中存储了不同结构的不同键,简单说就是
{
"key1":{
"key2":{
"value1":1,
"value2":1
},
"value1":1,
"value2":1
},
"key2":{
"value1":1,
"value2":1
}
}
由于PC端对两个键值的关系分别展示,展示不同的效果,但是在移动端需要兼容两个键的值,即把两个键中的值合并到同一个字段中展示。
问题来了,怎么通过JSON解析把key1中的key2和正常的key2合并
两个key2是相同的类
测试了一下fastjson解析是通过反射进行解析的,它不关心反射的类是不是你存进去对应的class。只关心能不能找到相同的键
所以我定义了两个属性,分别是key1和key2,key1是一个JSONObject,而key2是一个对应的实体类
在setKey1()方法的时候把需要实现的逻辑代码放进去就可以了
public void setNameLabel(List<NameLabelDto> nameLabel) {
for (int i = 0; i < nameLabel.size(); i++) {
NameLabelDto dto = nameLabel.get(i);
if (!this.nameLabel.contains(dto) && dto.getId() > 0) {
this.nameLabel.add(dto);
}
}
}
public void setFaceList(List<JSONObject> faceList) {
for (int i = 0; i < faceList.size(); i++) {
JSONObject json = faceList.get(i);
NameLabelDto dto = new NameLabelDto();
dto = JSONObject.parseObject(json.getString("member"), NameLabelDto.class);
if (!this.nameLabel.contains(dto) && dto.getId() > 0) {
this.nameLabel.add(dto);
}
}
}
把这个代码贴上去
大致意思就是在set方法的时候把获取到的值放入到已存在的list中
因为不知道哪一个字段先解析,所以就会有个问题,如果后解析的字段中那个值为空就会把原来的值进行覆盖,所以进行判断之后进行去重添加就不会有问题了。