前言
创建一个对象
public class sbfpdto{
private int code;
private string message;
}
在java开发中,对象与json、map等数据结构的互转是常见需求,下面涵盖fastjson和jackson两种常用库的使用方法。
一、json字符串转对象
1.fastjson库的正确用法
// 正确json字符串(注意英文引号)
string jsonstr = "{\"code\":2,\"message\":\"需要转换的对象\"}";
// 方法1:直接解析(推荐)
sbfpdto sbfp1 = json.parseobject(jsonstr, sbfpdto.class);
// 方法2:通过jsonobject解析
sbfpdto sbfp2 = jsonobject.parseobject(jsonstr, sbfpdto.class);
//将json字符串解析为jsonobject对象
jsonobject js=jsonobject.parseobject(jsonstr);
错误修正:示例json.parseobject(json.tojsonstring(jsonstr), sbfpdto .class)中 json.tojsonstring(jsonstr) 会导致双重转义(如"{\"code\":2}"变成"\"{\\\"code\\\":2}\""),应直接解析原始字符串,即json.tojsonstring 不应该对string类型进行转换。
2.jackson库的用法
import com.fasterxml.jackson.databind.objectmapper; import com.fasterxml.jackson.databind.deserializationfeature; // 创建objectmapper并配置忽略未知字段,设置未知列跳过 objectmapper mapper = new objectmapper(); mapper.configure(deserializationfeature.fail_on_unknown_properties, false); // 解析json sbfpdto sbfp = mapper.readvalue(jsonstr, sbfpdto.class);
关键点:
fail_on_unknown_properties配置可避免json中有多余字段时抛异常。- 必须处理
ioexception(需try-catch或声明抛出)。
其他:beanutil.maptobean();
二、json数组(jsonarray)转对象列表
fastjson优化版
string jsonstr = "{\"sbfplist\":[{\"code\":2,\"message\":\"对象1\"},{\"code\":3,\"message\":\"对象2\"}]}";
// 一步到位解析(推荐)
list<sbfpdto> sbfps = json.parseobject(jsonstr)
.getjsonarray("sbfplist")
.tojavalist(sbfpdto.class);
//详细步骤
jsonobject sfbpjson= json.parseobject(jsonstr);
jsonarray sbfparray = sfbpjson.getjsonarray("sbfplist");
list<sbfpdto> sbfps= jsonarray.parsearray(sbfparray.tojsonstring(), sbfpdto.class);
//2 直接转
string jsonstr2 = "[{\"code\":2,\"message\":\"对象1\"},{\"code\":3,\"message\":\"对象2\"}]";
list<sbfpdto> sbfps=jsonobject.parsearray(jsonstr2,sbfpdto.class);
list<sbfpdto> sbfps=json.parsearray(jsonstr2,sbfpdto.class);
优化说明:无需手动转换jsonarray到字符串再解析,直接使用tojavalist()方法更简洁高效。
jackson版
// 解析整个json
jsonnode root = mapper.readtree(jsonstr);
arraynode sbfparray = (arraynode) root.get("sbfplist");
// 转换为list
list<sbfpdto> sbfps = mapper.convertvalue(sbfparray, new typereference<list<sbfpdto>>() {});
三、对象转map
1. fastjson实现
sbfpdto dto = new sbfpdto(2, "需要转换的对象");
// 对象转json字符串,再转map
map<string, object> map = json.parseobject(json.tojsonstring(dto), new typereference<map<string, object>>() {});
//或者
map<string,object> map = json.parseobject(json.tojsonstring(jsonstr),map.class);
//将java对象序列化成json字符串
string jsonstr=json.tojsonstring(dto);
注意:直接使用map.class可能导致泛型类型丢失,推荐用typereference保留类型信息。
2. jackson实现(更高效)
// 直接转换对象为map
map<string, object> map = mapper.convertvalue(dto, new typereference<map<string, object>>() {});
其他:beanutil.beantomap();
四、最佳实践建议
库的选择:
- fastjson:api简洁,适合快速开发,但需注意线程安全问题(
json类部分方法非线程安全)。 - jackson:性能优异,社区活跃,推荐用于复杂项目。
- beanutil:hutool中的该类也可以进行map和bean之间的转换。
异常处理:
try {
sbfpdto dto = mapper.readvalue(jsonstr, sbfpdto.class);
} catch (ioexception e) {
// 处理解析失败(如日志记录、抛自定义异常等)
}
日期格式等高级配置:
// jackson配置日期格式
mapper.setdateformat(new simpledateformat("yyyy-mm-dd hh:mm:ss"));
避免中文引号:确保json字符串使用英文双引号 ",而非 “”。
通过上述方法,您可以安全高效地实现对象与json、map之间的转换。根据项目需求选择合适的库,并注意配置和异常处理,可显著提升代码健壮性。
到此这篇关于java中常用的json,jsonarray,map数据结构与对象互转详解的文章就介绍到这了,更多相关java常用对象互转内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论