jsonString和对象互转场景验证
在排查线上问题时,出现了json转dto对象时报错的情况,于是基于com.alibaba.fastjson.JSON进行了一系列验证过程。
类JsonDto
package com.json; import com.alibaba.fastjson.JSON; import java.util.List; import java.util.Map; public class JsonDto { /** * 字符串 */ private String str; /** * list集合 */ private List<String> list; /** * map对象 */ private Map<String, String> map; public String getStr() { return str; } public void setStr(String str) { this.str = str; } public List<String> getList() { return list; } public void setList(List<String> list) { this.list = list; } public Map<String, String> getMap() { return map; } public void setMap(Map<String, String> map) { this.map = map; } @Override public String toString() { return "JsonDto{" + "str=" + str + ", list=" + JSON.toJSONString(list) + ", map=" + JSON.toJSONString(map) + '}'; } }
类StringNameNotSameDto
package com.json; import com.alibaba.fastjson.JSON; import java.util.List; import java.util.Map; public class StringNameNotSameDto { /** * 字符串 */ private String str2; /** * list集合 */ private List<String> list; /** * map对象 */ private Map<String, String> map; public String getStr2() { return str2; } public void setStr2(String str2) { this.str2 = str2; } public List<String> getList() { return list; } public void setList(List<String> list) { this.list = list; } public Map<String, String> getMap() { return map; } public void setMap(Map<String, String> map) { this.map = map; } @Override public String toString() { return "StringNameNotSameDto{" + "str2=" + str2 + ", list=" + JSON.toJSONString(list) + ", map=" + JSON.toJSONString(map) + '}'; } }
类StringTypeNotSameDto
package com.json; import com.alibaba.fastjson.JSON; import java.util.List; import java.util.Map; public class StringTypeNotSameDto { /** * 字符串 */ private List<String> str; /** * list集合 */ private List<String> list; /** * map对象 */ private Map<String, String> map; public List<String> getStr() { return str; } public void setStr(List<String> str) { this.str = str; } public List<String> getList() { return list; } public void setList(List<String> list) { this.list = list; } public Map<String, String> getMap() { return map; } public void setMap(Map<String, String> map) { this.map = map; } @Override public String toString() { return "StringTypeNotSameDto{" + "str=" + JSON.toJSONString(str) + ", list=" + JSON.toJSONString(list) + ", map=" + JSON.toJSONString(map) + '}'; } }
类StringTypeNotSame2Dto
package com.json; import com.alibaba.fastjson.JSON; import java.util.List; import java.util.Map; public class StringTypeNotSame2Dto { /** * 字符串 */ private NewDto str; /** * list集合 */ private List<String> list; /** * map对象 */ private Map<String, String> map; public NewDto getStr() { return str; } public void setStr(NewDto str) { this.str = str; } public List<String> getList() { return list; } public void setList(List<String> list) { this.list = list; } public Map<String, String> getMap() { return map; } public void setMap(Map<String, String> map) { this.map = map; } @Override public String toString() { return "StringTypeNotSameDto{" + "str=" + JSON.toJSONString(str) + ", list=" + JSON.toJSONString(list) + ", map=" + JSON.toJSONString(map) + '}'; } }
类ListTypeNotSameDto
package com.json; import com.alibaba.fastjson.JSON; import java.util.List; import java.util.Map; public class ListTypeNotSameDto { /** * 字符串 */ private String str; /** * list集合 */ private String list; /** * map对象 */ private Map<String, String> map; public String getStr() { return str; } public void setStr(String str) { this.str = str; } public String getList() { return list; } public void setList(String list) { this.list = list; } public Map<String, String> getMap() { return map; } public void setMap(Map<String, String> map) { this.map = map; } @Override public String toString() { return "ListTypeNotSameDto{" + "str=" + str + ", list=" + JSON.toJSONString(list) + ", map=" + JSON.toJSONString(map) + '}'; } }
类NewDto
package com.json; public class NewDto { /** * 字符串 */ private String id; /** * 字符串 */ private String name; /** * 字符串 */ private String address; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "JsonDto{" + "id=" + id + ", name=" + name + ", address=" + address + '}'; } }
主类JSON2ObjectMain
package com.json; import com.alibaba.fastjson.JSON; import java.util.ArrayList; import java.util.List; public class JSON2ObjectMain { public static void main(String[] args) { JsonDto dto = new JsonDto(); // dto没有值时: String dto2Json = JSON.toJSONString(dto); System.out.println("dto to json string:" + dto2Json); JsonDto json2Dto = JSON.parseObject(dto2Json, JsonDto.class); System.out.println("json string to dto:" + json2Dto.toString()); System.out.println(); // dto部分属性有值时: dto.setStr("string test"); dto2Json = JSON.toJSONString(dto); System.out.println("dto to json string:" + dto2Json); json2Dto = JSON.parseObject(dto2Json, JsonDto.class); System.out.println("json string to dto:" + json2Dto.toString()); System.out.println(); // 当json串中部分字段名不匹配时:不报错,不匹配的字段没有值 StringNameNotSameDto stringNameNotSameDto = new StringNameNotSameDto(); stringNameNotSameDto.setStr2("string2"); String stringNameNotSameDto2Json = JSON.toJSONString(stringNameNotSameDto); System.out.println("stringNameNotSameDto to json string:" + stringNameNotSameDto2Json); StringNameNotSameDto similarJson2Dto = JSON.parseObject(stringNameNotSameDto2Json, StringNameNotSameDto.class); System.out.println("json string to stringNameNotSameDto:" + similarJson2Dto.toString()); json2Dto = JSON.parseObject(stringNameNotSameDto2Json, JsonDto.class); System.out.println("json string(stringNameNotSameDto) to dto:" + json2Dto.toString()); System.out.println(); // 当json串中部分字段,字段名相同但字段类型不匹配时(json中list是String类型,dto中list是List<String>):不报错 ListTypeNotSameDto listTypeNotSameDto = new ListTypeNotSameDto(); listTypeNotSameDto.setList("list value"); String listTypeNotSameDto2Json = JSON.toJSONString(listTypeNotSameDto); System.out.println("listTypeNotSameDto to json string:" + listTypeNotSameDto2Json); ListTypeNotSameDto listTypeNotSameDto2Json2Dto = JSON.parseObject(listTypeNotSameDto2Json, ListTypeNotSameDto.class); System.out.println("json string to listTypeNotSameDto:" + listTypeNotSameDto2Json2Dto.toString()); json2Dto = JSON.parseObject(listTypeNotSameDto2Json, JsonDto.class); System.out.println("json string(listTypeNotSameDto) to dto:" + json2Dto.toString()); System.out.println(); // 当json串中部分字段,字段名相同但字段类型不匹配时(json中str是List<String>类型,dto中str是String):不报错 StringTypeNotSameDto stringTypeNotSameDto = new StringTypeNotSameDto(); List<String> list = new ArrayList<>(); list.add("001"); list.add("002"); stringTypeNotSameDto.setStr(list); String stringTypeNotSameDto2Json = JSON.toJSONString(stringTypeNotSameDto); System.out.println("stringTypeNotSameDto to json string:" + stringTypeNotSameDto2Json); StringTypeNotSameDto stringTypeNotSameJson2Dto = JSON.parseObject(stringTypeNotSameDto2Json, StringTypeNotSameDto.class); System.out.println("json string to stringTypeNotSameDto:" + stringTypeNotSameJson2Dto.toString()); json2Dto = JSON.parseObject(stringTypeNotSameDto2Json, JsonDto.class); System.out.println("json string(stringTypeNotSameDto) to dto:" + json2Dto.toString()); System.out.println("+++" + json2Dto.getStr() + "+++"); System.out.println(); // 当json串中部分字段,字段名相同但字段类型不匹配时(json中str是NewDto类型,dto中str是String):不报错 StringTypeNotSame2Dto stringTypeNotSame2Dto = new StringTypeNotSame2Dto(); NewDto newDto = new NewDto(); newDto.setId("001"); newDto.setName("this is name"); stringTypeNotSame2Dto.setStr(newDto); String stringTypeNotSame2Dto2Json = JSON.toJSONString(stringTypeNotSame2Dto); System.out.println("stringTypeNotSame2Dto to json string:" + stringTypeNotSame2Dto2Json); StringTypeNotSame2Dto stringTypeNotSame2Json2Dto = JSON.parseObject(stringTypeNotSame2Dto2Json, StringTypeNotSame2Dto.class); System.out.println("json string to stringTypeNotSame2Dto:" + stringTypeNotSame2Json2Dto.toString()); json2Dto = JSON.parseObject(stringTypeNotSame2Dto2Json, JsonDto.class); System.out.println("json string(stringTypeNotSame2Dto) to dto:" + json2Dto.toString()); System.out.println("+++" + json2Dto.getStr() + "+++"); System.out.println(); } }
验证结论:如果属性名称不一致,则不会赋值成功(但不会报错),如果属性名称一致,但类型不一致,也会赋值成功。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
2020-01-03 2020年总结
2018-01-03 [转]java虚拟机工作原理详解