1.常见的json类库

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写,可以在多种语言之间进行数据交换。

选择一个合适的JSON库要从多个方面进行考虑:

①字符串解析成JSON性能;

②字符串解析成JavaBean性能;

③JavaBean构造JSON性能;

’④集合构造JSON性能;

⑤易用性。

常见的JSON类库为:FastJson,Json-lib、Gson、Jackson

maven依赖如下:

        <!--fastjson--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.75</version></dependency><!--json-lib--><dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><version>2.4</version><classifier>jdk15</classifier></dependency><!--gson--><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.6</version></dependency><!--jackson--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.1</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.13.1</version></dependency>

2.json类库的使用

举例以下的使用:(暂时这么称呼,在Jackson中未找到对应的方式)

java对象-->JSON对象
java对象-->JSON字符串
JSON对象-->java对象
JSON对象-->JSON字符串
JSON字符串-->JSON对象
JSON字符串-->java对象

student实体类

package com.lmc;/*** @author lmc* @version 1.0.0* @package PACKAGE_NAME description* @Description* @since 2022/8/9 17:29*/
public class Student {private String id;private String name;private String age;//省略有参构造、无参构造、set、get、toString
}

2.1FastJson

package com.lmc;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;/*** @author lmc* @version 1.0.0* @package PACKAGE_NAME description* @Description fastjson* @since 2022/8/9 17:27*/
public class FastJsonTest {public static void main(String[] args) {Student student = new Student("1", "盖伦", "22");System.out.println("======================java对象转成json对象、字符串====================");//java对象-->json对象JSONObject jsonObject = (JSONObject) JSONObject.toJSON(student);System.out.println("java对象-->json对象:" + jsonObject);//java对象-->字符串String s1 = JSON.toJSONString(student);System.out.println("java对象-->json字符串:" + s1);System.out.println();System.out.println("======================JSON对象转成java对象、字符串====================");//json对象-->java对象Student student1 = JSONObject.toJavaObject(jsonObject, Student.class);System.out.println("json对象-->java对象:" + student1.toString());//json对象-->字符串String s = JSONObject.toJSONString(jsonObject);System.out.println("json对象-->json字符串:" + s);System.out.println();System.out.println("======================字符串转成JSON对象、java对象====================");String stuString = "{\"id\":\"2\",\"name\":\"卢锡安\",\"age\":\"24\"}";//字符串-->JSON对象JSONObject jsonObject1 = JSONObject.parseObject(stuString);System.out.println("JSON字符串-->JSON对象:" + jsonObject1);//字符串-->java对象Student student2 = JSONObject.parseObject(stuString, Student.class);System.out.println("JSON字符串-->java对象:" + student2);}
}

运行结果:

2.2Json-lib

package com.lmc;import net.sf.json.JSONObject;/*** @author lmc* @version 1.0.0* @package PACKAGE_NAME description* @Description json-lib* @since 2022/8/9 15:52*/
public class JsonlibTest {public static void main(String[] args) {Student student = new Student("1", "盖伦", "22");System.out.println("======================java对象转成json对象、字符串====================");//java对象-->json对象JSONObject jsonObject = JSONObject.fromObject(student);System.out.println("java对象-->json对象:" + jsonObject);//java对象-->字符串  借助json对象吧String s1 = jsonObject.toString();System.out.println("java对象-->字符串:" + s1);System.out.println();System.out.println("======================JSON对象转成java对象、字符串====================");//json对象-->java对象Object o = JSONObject.toBean(jsonObject, Student.class);System.out.println("json对象-->java对象:" + o.toString());//json对象-->字符串String s2 = jsonObject.toString();System.out.println("json对象-->字符串:" + s2);System.out.println();System.out.println("======================字符串转成JSON对象、java对象====================");String stuString = "{\"id\":\"2\",\"name\":\"卢锡安\",\"age\":\"24\"}";//字符串-->JSON对象JSONObject jsonObject1 = JSONObject.fromObject(stuString);System.out.println("字符串-->JSON对象:" + jsonObject1);//字符串-->java对象  借助json对象吧Object o1 = JSONObject.toBean(jsonObject1, Student.class);System.out.println("字符串-->java对象:" + o1);}
}

运行结果:

2.3Gson

package com.lmc;import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;/*** @author lmc* @version 1.0.0* @package PACKAGE_NAME description* @Description gson* @since 2022/8/9 15:52*/
public class GsonTest {public static void main(String[] args) {Student student = new Student("1", "盖伦", "22");System.out.println("======================java对象转成json对象、字符串====================");//java对象-->json对象Gson gson = new Gson();JsonObject jsonObject = (JsonObject) gson.toJsonTree(student);System.out.println("java对象-->json对象:" + jsonObject);//java对象-->字符串String s = gson.toJson(student);System.out.println("java对象-->字符串:" + s);System.out.println();System.out.println("======================JSON对象转成java对象、字符串====================");//json对象-->java对象Student student1 = gson.fromJson(jsonObject, Student.class);System.out.println("json对象-->java对象:" + student1.toString());//json对象-->字符串String s2 = jsonObject.toString();System.out.println("json对象-->字符串:" + s2);System.out.println();System.out.println("======================字符串转成JSON对象、java对象====================");String stuString = "{\"id\":\"2\",\"name\":\"卢锡安\",\"age\":\"24\"}";//字符串-->JSON对象JsonObject returnData = new JsonParser().parse(stuString).getAsJsonObject();System.out.println("字符串-->JSON对象:" + returnData);//字符串-->java对象Student student2 = gson.fromJson(stuString, Student.class);System.out.println("字符串-->java对象:" + student2);}
}

运行结果:

2.4Jackson

package com.lmc;import com.fasterxml.jackson.databind.ObjectMapper;/*** @author lmc* @version 1.0.0* @package PACKAGE_NAME description* @Description jackson* @since 2022/5/31 15:46*/
public class JacksonTest {public static void main(String[] args) throws Exception {Student student = new Student("1", "盖伦", "22");System.out.println("======================java对象转成json对象、字符串====================");ObjectMapper objectMapper = new ObjectMapper();//java对象-->字符串String s = objectMapper.writeValueAsString(student);System.out.println("java对象-->字符串:" + s);System.out.println();System.out.println("======================字符串转成JSON对象、java对象====================");String stuString = "{\"id\":\"2\",\"name\":\"卢锡安\",\"age\":\"24\"}";//字符串-->java对象Student student1 = objectMapper.readValue(stuString, Student.class);System.out.println("字符串-->java对象:" + student1);}
}

运行结果:

3.遇到的问题及解决方法

3.1JSONArray相关使用

JSONArray:顾名思义是由JSONObject构成的数组,用 [ { } , { } , ...... , { } ] 来表示

从字符串中获取JSONArray对象(以fastJson为例):

package com.lmc;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;public class JsonArrayTest {public static void main(String[] args) {String s = "[{\"id\":\"1\", \"name\":\"盖伦\", \"age\":\"22\"},{\"id\":\"2\", \"name\":\"卢锡安\", \"age\":\"24\"}]";JSONArray objects = JSONArray.parseArray(s);JSONObject o = (JSONObject)objects.get(0);System.out.println(o.toString());}
}

运行结果:

3.2JSONArray使用避雷

package com.lmc;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;public class JsonArrayTest {public static void main(String[] args) {System.out.println("=================正确使用========================");JsonArrayTest jsonArrayTest = new JsonArrayTest();JSONArray jsonArray = jsonArrayTest.getJSONArray();System.out.println(jsonArray.toString());System.out.println("===============错误使用==================");JSONArray objects = jsonArrayTest.errorUse();System.out.println(objects.toString());}public JSONArray getJSONArray() {JSONArray jsonarray = new JSONArray();jsonarray.add(getJsonObj("1", "张三"));jsonarray.add(getJsonObj("2", "李四"));jsonarray.add(getJsonObj("3", "王五"));jsonarray.add(getJsonObj("1", "张三"));jsonarray.add(getJsonObj("2", "李四"));jsonarray.add(getJsonObj("3", "王五"));jsonarray.add(getJsonObj("1", "张三"));jsonarray.add(getJsonObj("2", "李四"));jsonarray.add(getJsonObj("3", "王五"));return jsonarray;}public JSONObject getJsonObj(String name, String value) {JSONObject jsonobj = new JSONObject();jsonobj.put(name, value);return jsonobj;}public JSONArray errorUse() {JSONArray jsonarray = new JSONArray();JSONObject jsonobj = new JSONObject();for (int i = 0; i < 3; i++) {jsonobj.put("1", "张三");jsonobj.put("2", "李四");jsonobj.put("3", "王五");jsonarray.add(jsonobj);}return jsonarray;}
}

运行结果:

这种getJSONObject 函数形成jsonobj 的方式非常好,可以避免循环引用或jsonobj 后来的覆盖前面的。

解释:

其中正确使用中,每次都要新new出一个对象,不然循环了三次,其实是一直更新一个对象,jsonarray中存的就是最终被修改的jsonobj。
这就是java中的一切都是引用的原则,jsonarray虽然add的是Object,但是最终add的是引用,所以要add不同对象,就必须每次new一个新的。
读了源码,这里jsonarray是用List实现的,故而推广到List.add(Object)上,也是一样,每次add,都要新new一个对象再add。

3.3json字符串中含有的value为null

当字符串中value为null时,在使用spring mvc返回页面值的时候可能会报500。错误:JSON error Could not write content: Object is null (through reference

org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: Object is null (through reference chain: cn.steam.response.ResponseEntityBase["data"]->java.util.HashMap["orderInfo"]->net.sf.json.JSONObject["data"]->net.sf.json.JSONArray[0]->net.sf.json.JSONObject["areaCode"]->net.sf.json.JSONNull["empty"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Object is null (through reference chain: cn.steam.response.ResponseEntityBase["data"]->java.util.HashMap["orderInfo"]->net.sf.json.JSONObject["data"]->net.sf.json.JSONArray[0]->net.sf.json.JSONObject["areaCode"]->net.sf.json.JSONNull["empty"])at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:272) ~[spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE]at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:100) ~[spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE]at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:222) ~[spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:153) ~[spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:165) ~[spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:80) ~[spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE]at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:126) ~[spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:817) ~[spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:731) ~[spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) [spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) [spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:968) [spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:859) [spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) [servlet-api.jar:?]at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:844) [spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) [servlet-api.jar:?]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) [catalina.jar:7.0.96]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.96]at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat7-websocket.jar:7.0.96]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.96]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.96]at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) [spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.96]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.96]at cn.steam.filter.ApiFilter.doFilter(ApiFilter.java:58) [classes/:?]at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) [spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE]at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) [spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.96]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.96]at cn.steam.filter.VerifyWebFilter.doFilter(VerifyWebFilter.java:33) [classes/:?]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.96]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.96]at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) [catalina.jar:7.0.96]at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110) [catalina.jar:7.0.96]at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:444) [catalina.jar:7.0.96]at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) [catalina.jar:7.0.96]at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104) [catalina.jar:7.0.96]at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025) [catalina.jar:7.0.96]at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) [catalina.jar:7.0.96]at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445) [catalina.jar:7.0.96]at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1137) [tomcat-coyote.jar:7.0.96]at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637) [tomcat-coyote.jar:7.0.96]at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2579) [tomcat-coyote.jar:7.0.96]at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2568) [tomcat-coyote.jar:7.0.96]at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_92]at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_92]at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-coyote.jar:7.0.96]at java.lang.Thread.run(Thread.java:745) [?:1.8.0_92]

json字符串如下:

解决方法:

// 把null 替换成 ""
jsonstr.replaceAll("null", "\"\"");

原文链接:

JSON error Could not write content: Object is null (through reference_小贼驴的博客-CSDN博客

JSONArray使用_nx188的博客-CSDN博客_getjsonarray

Java中常用的 JSON 库性能比较_BUG弄潮儿的技术博客_51CTO博客

常见的JSON类库简单使用和遇到的问题相关推荐

  1. 两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)

    本篇文章主要介绍了"两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)",主要涉及到两款JSON类库Jackson与JSON-lib的性能对比(新增第三款 ...

  2. 三款JSON类库Jackson,Gson与JSON-lib的性能对比

    近日做一些性能优化工作,在挑选JSON类库时,发现除了一般常用的JSON-lib外,还有一款号称性能最快的JSON处理器Jackson,于是用上了刚学会的JMeter,对这两个类库进行了简单的性能对比 ...

  3. Java常见应用——Json,二维码生成,加密解密应用

    Java常见应用--Json,二维码生成,加密解密应用 一.JSON 1.下载json架包,json官网:json.org 2.将Map/JavaBean/String转化成json对象,只需要使用J ...

  4. json的简单的数据格式

    json的简单数据格式 var arr={"obj1":["张三","12","女"],"obj2" ...

  5. 39条常见的Linux系统简单面试题

    39条常见的Linux系统简单面试题 本文主要分享39条常见的Linux系统简单面试题,其中包括如何看当前Linux系统有几颗物理CPU和每颗CPU的核数.如何实时查看网卡流量为多少等等,希望对你有所 ...

  6. Atitit.json类库的设计与实现 ati json lib

    Atitit.json类库的设计与实现 ati json lib 1. 目前jsonlib库可能有问题,可能版本冲突,抛出ex1 2. 解决之道:1 2.1. 自定义json解析库,使用多个复合的js ...

  7. Go基础:常见的json包--encoding/json、easyjson、ffjson、json-iterator/go

    本文对常见的json包做一些介绍,方便快速入门.每一小节均有示例说明.大家在实际开发中可以选择适合自己的json包. encoding/json encoding/json是官方提供的标准json, ...

  8. js中常见的Json解析

    一.什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式, 是理想的数据交换格式,同时,JSON是 JavaSc ...

  9. 业内常见电子病历编辑器简单比较(2)数据元功能比较

    业内常见电子病历编辑器简单比较(2)数据元功能比较 数据元处理,卫生部从09年到现在,连发三版数据元标准,可见数据元对病历的重要性,其实作为一个搞信息的人都知道,如果病历实现电子化后,不能做结构化处理 ...

最新文章

  1. 105. oracle 经典查询 总结
  2. apollo 配置中心_分布式配置中心之Apollo
  3. 漫画:35岁的IT会不会失业?
  4. 简述linux常见的安全措施,六个常用的Linux安全基本措施
  5. markdown入门4--矩阵空格公式方程组
  6. 整洁架构设计分析--架构设计的本质是什么?
  7. T^T找数字(搜索+二进制枚举)
  8. Git版本控制,一个本地子分支修改了代码(包括依赖pom)任何文件,然后本地主分支就自动更改为子分支的!这个问题这样解决
  9. 常见Sql面试题及答案
  10. 宽带无线通信OFDM技术
  11. linux能解锁小米手机吗,【BL锁】还在为小米手机如何解锁及解锁后如何加锁而烦恼吗?...
  12. Netbean UML自动生成类图
  13. 介绍一种冷门但简单的双拼方案——紫光双拼
  14. 误删阿里云mysql恢复数据恢复_阿里云数据库表数据误删恢复
  15. 我找到了村里最挣钱的生意!
  16. Word、PPT、PDF 文件怎么批量插入首页、扉页、尾页?怎么在指定位置插入页?
  17. 面试笔记-1.计算机网络面试核心
  18. Spring Boot Actuator与Spring Boot Admin详解
  19. 「雅礼集训 2018 Day10」贪玩蓝月
  20. android t9 实体键盘,最强安卓老人机 T9键盘/爷爷的荣耀神器

热门文章

  1. Adams2013:MSC_LICENSE_FILE=27500@主机名
  2. python的matplotlib.pyplot绘制甘特图
  3. 对标世界一流|从Just in time到Just in case ——汽车行业供应链管理经验借鉴
  4. php中对数组进行for循环,php数组for循环
  5. 表单的应用之简单饭店菜单
  6. 理财公司天基实业投资理财学习心得
  7. java 解析excel获取单元格内容封装方法(兼容2003和2007)
  8. springboot+idea自动刷新
  9. android实现runnable接口,013 Android多线程-实现Runnable接口
  10. 怎样赞美别人更有创意?