前言
在现在的日常开发中,不管前端还是后端,JSON 格式的数据是用得比较多的,甚至可以说无处不在。
接触最多的就是 POST 请求中传递的数据一般以 JSON 的格式放在请求体中,而且服务端各种 API 返回的数据,在响应体中也基本都是以 JSON 格式的数据进行返回的,这也是 RESTful 风格的体现之一。
当然,不止是请求与响应的过程中使用到 JSON,在某些业务场景下也是需要用到 JSON 的,特别是 JSON 与 Java 对象之间的转化。
所以,对于 Java 开发的我们来说,JSON 格式的数据与 Java 对象之间的转化是必会的。
转化的工具
主流的转化工具有如下几种,一般项目中建议只选其中一种,目前好评最多的感觉就是 Jackson 了。
Jackson
FastJson
Gson
Hutool
准备的 JSON 字符串和 List
为了方便演示,这里给出一个 JSON 字符串:
String jsonStr = "{\"name\" : \"GTA5\", \"price\" : 54.5}";
这里给出一个List
:
Game game1 = Game.builder().name("NBA2K23").price(new BigDecimal("198.0")).build();Game game2 = Game.builder().name("Sim City4").price(new BigDecimal("22.5")).build();List gameList = new ArrayList();gameList.add(game1);gameList.add(game2);
Jackson
我们需要借助 Jackson 提供的ObjectMapper
对象来完成转化:
ObjectMapper objectMapper = new ObjectMapper();
将 JSON 字符串 转成 Java 对象:readValue
使用readValue
方法,第一个参数是 JSON 字符串,第二个参数是转化的目标类的类型。
// 将 JSON 字符串 转成 Java 对象Game game = objectMapper.readValue(jsonStr, Game.class);
将 Java 对象转成 JSON 字符串:writeValueAsString
使用writeValueAsString
方法,接受一个 Java 对象,返回一个 JSON 字符串。
// 将 Java 对象转成 JSON 字符串String gameJson = objectMapper.writeValueAsString(game);
将 List 转成 JSON 字符串:writeValueAsString
同样使用writeValueAsString
方法。
// 将 List 转成 JSON 字符串String gameListJson = objectMapper.writeValueAsString(gameList);
将 JSON 字符串 转成 List:readValue
使用readValue
方法,第一个参数是 JSON 字符串,第二个参数是转化的目标 TypeReference(类型参照)对象,这里指定其泛型为List
。
// 将 JSON 字符串 转成 ListList gameListFromJson = objectMapper.readValue(gameListJson, new TypeReference<List>() {});
总结
从 JSON 到 Java 对象,使用readValue
方法。
从 Java 对象到 JSON,使用writeValueAsString
方法。
FastJson
我们需要借助 FastJson 提供的JSONObject
对象来完成转化。
将 JSON 字符串 转成 Java 对象:parseObject
使用parseObject
方法,将 JSON 字符串解析(转化)成 Java 对象,第一个参数是 JSON 字符串,第二个参数是目标类的类型。
// 将 JSON 字符串 转成 Java 对象Game game = JSONObject.parseObject(jsonStr, Game.class);
将 Java 对象转成 JSON 字符串:toJSONString
使用toJSONString
方法,将 Java 对象直接转成 JSON 字符串,接受一个 Java 对象,返回对应的 JSON 字符串。
// 将 Java 对象转成 JSON 字符串String gameJson = JSONObject.toJSONString(game);
将 List 转成 JSON 字符串:toJSONString
同理,可以直接丢一个 List 对象给toJSONString
方法,把 List 转成 JSON 字符串。
// 将 List 转成 JSON 字符串String gameListJson = JSONObject.toJSONString(gameList);
将 JSON 字符串 转成 List:parseArray
使用parseArray
方法,将 JSON 字符串解析成 List。2.0 版本需要调用toJavaList
方法,得到最后的 List
// 将 JSON 字符串 转成 List// fastjson 1.2.x 版本:List gameListFromJson = JSONObject.parseArray(gameListJson, Game.class);List gameListFromJson = JSONArray.parseArray(gameListJson).toJavaList(Game.class);
总结
JSON 转成 Java Bean 使用parseObject
方法,转成 List 使用parseArray
方法。
任意对象转成 JSON,则使用toJSONString
方法。
Gson
我们需要借助Gson
对象来完成转化:
Gson gson = new Gson();
将 JSON 字符串 转成 Java 对象:fromJson
使用fromJson
方法,两个参数的定义也是和上面两个一样的。
// 将 JSON 字符串 转成 Java 对象Game game = gson.fromJson(jsonStr, Game.class);
将 Java 对象转成 JSON 字符串:toJson
使用toJson
方法,接受一个 Java 对象,然后返回对应的 JSON 字符串。
// 将 Java 对象转成 JSON 字符串String gameJson = gson.toJson(game);
将 List 转成 JSON 字符串:toJson
List 也是同理,使用toJson
方法。
// 将 List 转成 JSON 字符串String gameListJson = gson.toJson(gameList);
将 JSON 字符串 转成 List:fromJson
这里和 Jackson 的也是类似,第二个参数使用TypeToken
对象指定转化的目标类型为List
。
// 将 JSON 字符串 转成 ListList gameListFromJson = gson.fromJson(gameListJson, new TypeToken<List>() {}.getType());
总结
从 JSON 到 Java 对象,使用fromJson
方法。
从 Java 对象到 JSON,使用toJson
方法。
Hutool
我们需要借助 Hutool 提供的JSONUtil
对象来完成转化。
将 JSON 字符串 转成 Java 对象:toBean
使用toBean
方法,还是同样的,接受的两个参数,一个字符串,一个目标类的类型。
// 将 JSON 字符串 转成 Java 对象Game game = JSONUtil.toBean(jsonStr, Game.class);
将 Java 对象转成 JSON 字符串:toJsonStr
使用toJsonStr
方法,接受一个 Java 对象,返回一个 JSON 字符串。
// 将 Java 对象转成 JSON 字符串String gameJson = JSONUtil.toJsonStr(game);
将 List 转成 JSON 字符串:toJsonStr
同理,也是toJsonStr
方法。
// 将 List 转成 JSON 字符串String gameListJson = JSONUtil.toJsonStr(gameList);
将 JSON 字符串 转成 List:toList
使用toList
方法,和toBean
方法接受的参数一样。
// 将 JSON 字符串 转成 ListList gameListFromJson = JSONUtil.toList(gameListJson, Game.class);
总结
JSON 转成 Java Bean 使用toBean
方法,转成 List 使用toList
方法。
任意对象转成 JSON,则使用toJsonStr
方法。