常见的JSON类库简单使用和遇到的问题
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类库简单使用和遇到的问题相关推荐
- 两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)
本篇文章主要介绍了"两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)",主要涉及到两款JSON类库Jackson与JSON-lib的性能对比(新增第三款 ...
- 三款JSON类库Jackson,Gson与JSON-lib的性能对比
近日做一些性能优化工作,在挑选JSON类库时,发现除了一般常用的JSON-lib外,还有一款号称性能最快的JSON处理器Jackson,于是用上了刚学会的JMeter,对这两个类库进行了简单的性能对比 ...
- Java常见应用——Json,二维码生成,加密解密应用
Java常见应用--Json,二维码生成,加密解密应用 一.JSON 1.下载json架包,json官网:json.org 2.将Map/JavaBean/String转化成json对象,只需要使用J ...
- json的简单的数据格式
json的简单数据格式 var arr={"obj1":["张三","12","女"],"obj2" ...
- 39条常见的Linux系统简单面试题
39条常见的Linux系统简单面试题 本文主要分享39条常见的Linux系统简单面试题,其中包括如何看当前Linux系统有几颗物理CPU和每颗CPU的核数.如何实时查看网卡流量为多少等等,希望对你有所 ...
- Atitit.json类库的设计与实现 ati json lib
Atitit.json类库的设计与实现 ati json lib 1. 目前jsonlib库可能有问题,可能版本冲突,抛出ex1 2. 解决之道:1 2.1. 自定义json解析库,使用多个复合的js ...
- Go基础:常见的json包--encoding/json、easyjson、ffjson、json-iterator/go
本文对常见的json包做一些介绍,方便快速入门.每一小节均有示例说明.大家在实际开发中可以选择适合自己的json包. encoding/json encoding/json是官方提供的标准json, ...
- js中常见的Json解析
一.什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式, 是理想的数据交换格式,同时,JSON是 JavaSc ...
- 业内常见电子病历编辑器简单比较(2)数据元功能比较
业内常见电子病历编辑器简单比较(2)数据元功能比较 数据元处理,卫生部从09年到现在,连发三版数据元标准,可见数据元对病历的重要性,其实作为一个搞信息的人都知道,如果病历实现电子化后,不能做结构化处理 ...
最新文章
- CVPR NTIRE 2022|双目超分辨率挑战赛开赛
- 2.数据库的基本操作针对于库层面的操作
- Android开发环境搭建全程演示(jdk+eclip+android sdk)
- 自研开源框架 Midway Serverless ,让前端提效 50% 背后的故事
- Flink – JobManager.submitJob
- apche 禁止运行php,学习猿地-apache如何禁止执行php
- Oscache 概述
- 开课吧:深入了解软件开发原则有哪些?
- xcode环境变量设置(转载)
- mp4编码为hevc无法在浏览器播放的问题(java进行转码为h264)
- OSX 安装MongoDB
- 小米手机的专用计算机连接软件,小米手机怎么连接电脑?这些方法值得收藏!...
- tcp wireshark 过滤syn_抓包工具Wireshark常用过滤使用方法
- TensorFlow中CNN的两种padding方式“SAME”和“VALID”
- 腾讯6W月薪架构师能力曝光!微信架构为什么是史上最值钱的IM架构?
- 产品经理入门攻略(3岁的PM成长分享)
- domian shift
- 磁盘与文件系统管理详解
- 学习安装unik环境——过程一
- 【电商】管理后台之账号管理
热门文章
- vue项目本地跨域、线上跨域、本地链接线上地址跨域、https站点使用ws协议跨域问题解决
- 如何解决回调地狱问题
- 达梦数据库schema管理
- 2.自然语言处理NLP:词映射为向量——词嵌入(word embedding)
- ICG-PEG-CHO,吲哚菁绿-聚乙二醇-醛基 荧光染料试剂说明
- API接口自动化测试框架搭建(四)-Python依赖环境安装
- opencv——waitkey()函数
- EDM邮件模板制作规范小结
- IT职场:外企面试官最爱提的问题TOP10
- 项目启动时报错Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError...