搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > 新一代程序猿 > Json解析知多少

Json解析知多少

新一代程序猿 2020-07-28

Json

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

解析Json工具类

目前对于Java开源的JSON类库有很多种,下面我们取4个常用的JSON库进行性能测试对比, 同时根据测试结果分析如果根据实际应用场景选择最合适的JSON库。这4个JSON类库分别为:Gson,FastJson,Jackson,Json-lib。

Json-lib

json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,对于复杂类型的转换,json-lib对于json转换成bean还有缺陷, 比如一个类里面会出现另一个类的list或者map集合,json-lib从json到bean的转换就会出现问题。json-lib在功能和性能上面都不能满足现在互联网化的需求。Maven 依赖

 
   
   
 
  1. <dependency>

  2. <groupId>net.sf.json-lib</groupId>

  3. <artifactId>json-lib</artifactId>

  4. <version>2.4</version>

  5. <classifier>jdk15</classifier>

  6. </dependency>

基本操作

 
   
   
 
  1. public static void main(String[] args) throws IOException, InterruptedException {

  2. String json = ApiService.getApi();

  3. JSONObject jsonObject = JSONObject.fromObject(json);

  4. String city = JSONObject.fromObject(jsonObject.get("cityInfo")).get("city").toString();

  5. JSONArray jsonArray = JSONObject.fromObject(jsonObject.get("data")).getJSONArray("forecast");


  6. List<weather> weathers =new ArrayList<>();

  7. System.out.println(jsonArray.size());

  8. for (int i =0;i<jsonArray.size();i++){

  9. //转实体类

  10. weather weather = (weather)JSONObject.toBean((JSONObject) jsonArray.get(i), weather.class);

  11. weathers.add(weather);

  12. }

  13. System.out.println(city);

  14. weathers.forEach(e->{

  15. System.out.println(e);

  16. });




  17. }

Gson

Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,但自从在2008年五月公开发布第一版后已被许多公司或用户应用。Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。在使用这种对象转换之前,需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。类里面只要有get和set方法,Gson完全可以实现复杂类型的json到bean或bean到json的转换,是JSON解析的神器。Maven 依赖

 
   
   
 
  1. <dependency>

  2. <groupId>com.google.code.gson</groupId>

  3. <artifactId>gson</artifactId>

  4. <version>2.8.6</version>

  5. </dependency>

基本操作

 
   
   
 
  1. public static void main(String[] args) throws IOException, InterruptedException {

  2. Gson gson = new Gson();

  3. List<weather> json = ApiService.GetList();

  4. String toJson = gson.toJson(json);

  5. System.out.println("List转json:"+toJson);

  6. List<weather> weathers=gson.fromJson(toJson, new TypeToken<List<weather>>() {}.getType());


  7. System.out.println("json转List:"+weathers);


  8. }

  • 关于FastJson漏洞

fastjson 当前版本为 1.2.68 发布于 3 月底,日前某安全运营中心监测到,fastjson <= 1.2.68 版本存在远程代码执行漏洞,漏洞被利用可直接获取服务器权限。360CERT 将漏洞等级定为“高危 Maven 依赖

 
   
   
 
  1. <dependency>

  2. <groupId>com.alibaba</groupId>

  3. <artifactId>fastjson</artifactId>

  4. <version>1.2.72</version>

  5. </dependency>

基本操作

 
   
   
 
  1. public class FastJson {

  2. public static void main(String[] args) throws IOException, InterruptedException {

  3. String json = ApiService.getApi();

  4. JSONObject jsonObject = JSONObject.parseObject(json);

  5. Object data = jsonObject.get("data");

  6. String toJSONString = JSON.toJSONString(data);

  7. JSONArray jsonArray = JSONObject.parseObject(toJSONString).getJSONArray("forecast");

  8. List<weather> weathers = JSON.parseArray(JSON.toJSONString(jsonArray), weather.class);

  9. weathers.forEach(o->{

  10. System.out.println(o);

  11. });



  12. }

  13. }

Jackson

Jackson是当前用的比较广泛的,用来序列化和反序列化json的Java开源框架。Jackson社区相对比较活跃,更新速度也比较快, 从Github中的统计来看,Jackson是最流行的json解析器之一,Spring MVC的默认json解析器便是Jackson。

Jackson优点很多:

Jackson 所依赖的jar包较少,简单易用。与其他 Java 的 json 的框架 Gson 等相比,Jackson 解析大的 json 文件速度比较快。Jackson 运行时占用内存比较低,性能比较好 Jackson 有灵活的 API,可以很容易进行扩展和定制。Jackson 是spring推荐的json解析工具,拥有强大的注解

常用注解

@JsonProperty: 属性使用的注解,用来表示外部属性名字,就是使用别名序列化,而不是对象的 @JsonAutoDetect: 实体类使用的注解,用于重新设置实体类中属性的自动发现机制。@JsonFormat: 实体类/属性使用的注解,在序列化或者反序列化的时候,指定属性格式化日期/时间。

Maven 依赖

 
   
   
 
  1. <dependency>

  2. <groupId>com.fasterxml.jackson.core</groupId>

  3. <artifactId>jackson-core</artifactId>

  4. <version>2.9.8</version>

  5. </dependency>

  6. <dependency>

  7. <groupId>com.fasterxml.jackson.core</groupId>

  8. <artifactId>jackson-databind</artifactId>

  9. <version>2.10.2</version>

  10. </dependency>

基本操作

 
   
   
 
  1. public class JackJson {

  2. public static void main(String[] args) throws IOException, InterruptedException {


  3. List<weather> json = ApiService.GetList();

  4. weather weather = json.get(0);

  5. System.out.println("对象转json:"+JsonUtils.toJsonWithDefaultPrettyPrinter(weather));

  6. Map<String,Object> map =new HashMap<>();

  7. map.put("1","上海");

  8. map.put("2","北京");

  9. map.put("3","天津");

  10. map.put("4","深圳");

  11. Map<String,Object> map1 =new HashMap<>();

  12. map1.put("city",map);

  13. Map<String, Object> objectMap = JsonUtils.removeMapEmptyValue(map);

  14. System.out.println("Map转json:"+objectMap);


  15. String jsonTow = JsonUtils.toJsonWithDefaultPrettyPrinter(map1);

  16. System.out.println("Map嵌套转json"+jsonTow);




  17. }

  18. }

JsonUtils工具类

 
   
   
 
  1. public class JsonUtils {


  2. private static final ObjectMapper mapper;


  3. private JsonUtils() {

  4. }


  5. static {

  6. mapper = new ObjectMapper();

  7. mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

  8. }


  9. public static final String toJson(Object obj) {

  10. try {

  11. return mapper.writeValueAsString(obj);

  12. } catch (Throwable e) {

  13. e.printStackTrace();

  14. }

  15. return "";

  16. }


  17. public static final String toJsonWithDefaultPrettyPrinter(Object obj) {

  18. try {

  19. return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);

  20. } catch (Throwable e) {

  21. e.printStackTrace();

  22. }

  23. return "";

  24. }


  25. public static final <T> T fromJson(final String json, Class<T> clazz) {

  26. try {

  27. return mapper.readValue(json, clazz);

  28. } catch (Throwable e) {

  29. e.printStackTrace();

  30. }

  31. return null;

  32. }


  33. public static final <T> T fromJson(final String json, JavaType type) {

  34. try {

  35. return mapper.readValue(json, type);

  36. } catch (Throwable e) {

  37. e.printStackTrace();

  38. }

  39. return null;

  40. }


  41. public static final <T> T fromJson(final String json, TypeReference<T> reference) {

  42. try {

  43. return mapper.readValue(json, reference);

  44. } catch (Throwable e) {

  45. e.printStackTrace();

  46. }

  47. return null;

  48. }


  49. public static final Map<String, Object> fromJson(final String json) {

  50. return fromJson(json, Map.class);

  51. }


  52. public static Map<String, Object> removeMapEmptyValue(Map<String, Object> paramMap) {

  53. Set<String> set = paramMap.keySet();

  54. Iterator<String> it = set.iterator();

  55. List<String> listKey = new ArrayList<String>();

  56. while (it.hasNext()) {

  57. String str = it.next();

  58. if (paramMap.get(str) == null || "".equals(paramMap.get(str))) {

  59. listKey.add(str);

  60. }

  61. }

  62. for (String key : listKey) {

  63. paramMap.remove(key);

  64. }

  65. return paramMap;

  66. }


  67. }


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《Json解析知多少》的版权归原作者「新一代程序猿」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注新一代程序猿微信公众号

新一代程序猿微信公众号:jackgeeks2018

新一代程序猿

手机扫描上方二维码即可关注新一代程序猿微信公众号

新一代程序猿最新文章

精品公众号随机推荐

上一篇 >>

挤时间学JDK源码