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. CVPR NTIRE 2022|双目超分辨率挑战赛开赛
  2. 2.数据库的基本操作针对于库层面的操作
  3. Android开发环境搭建全程演示(jdk+eclip+android sdk)
  4. 自研开源框架 Midway Serverless ,让前端提效 50% 背后的故事
  5. Flink – JobManager.submitJob
  6. apche 禁止运行php,学习猿地-apache如何禁止执行php
  7. Oscache 概述
  8. 开课吧:深入了解软件开发原则有哪些?
  9. xcode环境变量设置(转载)
  10. mp4编码为hevc无法在浏览器播放的问题(java进行转码为h264)
  11. OSX 安装MongoDB
  12. 小米手机的专用计算机连接软件,小米手机怎么连接电脑?这些方法值得收藏!...
  13. tcp wireshark 过滤syn_抓包工具Wireshark常用过滤使用方法
  14. TensorFlow中CNN的两种padding方式“SAME”和“VALID”
  15. 腾讯6W月薪架构师能力曝光!微信架构为什么是史上最值钱的IM架构?
  16. 产品经理入门攻略(3岁的PM成长分享)
  17. domian shift
  18. 磁盘与文件系统管理详解
  19. 学习安装unik环境——过程一
  20. 【电商】管理后台之账号管理

热门文章

  1. vue项目本地跨域、线上跨域、本地链接线上地址跨域、https站点使用ws协议跨域问题解决
  2. 如何解决回调地狱问题
  3. 达梦数据库schema管理
  4. 2.自然语言处理NLP:词映射为向量——词嵌入(word embedding)
  5. ICG-PEG-CHO,吲哚菁绿-聚乙二醇-醛基 荧光染料试剂说明
  6. API接口自动化测试框架搭建(四)-Python依赖环境安装
  7. opencv——waitkey()函数
  8. EDM邮件模板制作规范小结
  9. IT职场:外企面试官最爱提的问题TOP10
  10. 项目启动时报错Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError...