java对象数据与json对象数据之间的相互转换(fastjson)(代码片段)

一宿君 一宿君     2023-02-24     777

关键词:

1、JSON是什么

JSON ( JavaScript Object Notation) ,是一种数据交互格式。

在JSON问世之前,大多使用XML传递数据,XML是一种纯文本格式,在很长一段时间内XML成为了互联网业界内的数据传输格式的主流标准。但是后来有人对XML提出了质疑,认为XML数据格式比较繁杂,冗长等弊端,于是提出了很多新的解决方案,但是在众多解决方案中,仍然没有一个能让人觉得很称心如意的,终于在2001年的时候,道格拉斯·克罗克福特(Douglas Crockford)撑不住劲发明了一种超轻量级的数据交换格式,这就是JSON,并且在2006年的时候,JSON在互联网业界内开始被广泛普及使用。

JSON建构于两种结构:

  • 键:值”对的集合(A collection of name/value pairs)

在不同的语言中,它被理解为:

  • 对象(object)
  • 纪录(record)
  • 结构(struct)
  • 字典(dictionary)
  • 哈希表(hash table)
  • 有键列表(keyed list)
  • 关联数组 (associative array)

而它的值,是有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

记住JSON是一种数据传输格式,并不是一门语言,目前基本上所有的编程语言都支持JSON数据格式。

2、JSON数据格式对照

JSON 实际上是 JavaScript 的一个子集,所以JSON 的数据格式和 JavaScript 是一一对应的:

JSONJavaScript
numbernumber
booleanboolean
stringstring
nullnull
array表达式为 [ ]
object表达式为

JSON数据格式与Java数据格式对照(映射):

JSONJava
numberjava.lang.Number
booleanboolean
stringjava.lang.string
nullnull
arrayjava.util.List
objectjava.util.Map

上述Java对照表中:实体映射是从左侧向右侧解码或解析,映射实体是从右侧到左侧编码。

解码或解析的时候:

默认 java.util.List -> org.json.simple.JSONArray 
默认 java.util.Map -> org.json.simple.JSONObject

注意事项:

  • JSON规范字符集是UTF-8,字符串必须使用"",Object对象的键也必须使用""包裹。
  • 数组的最后一个成员,不能加逗号

3、主流JSON库对比

3.1、json-lib【不推荐使用】

json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,包括

  • commons-beanutils.jar
  • commons-collections-3.2.jar
  • commons-lang-2.6.jar
  • commons-logging-1.1.1.jar
  • ezmorph-1.0.6.jar

对于复杂类型的转换,json-lib对于json转换成bean还有缺陷,比如一个类里面会出现另一个类的list或者map集合,json-lib从json到bean的转换就会出现问题。
json-lib在功能和性能上面都不能满足现在互联网化的需求。

<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
    <classifier>jdk15</classifier>
</dependency>

3.2、Jackson【根据场景使用】

相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。而且Jackson社区相对比较活跃,更新速度也比较快。是SpringBoot默认的json解析。

	<dependency>
	    <groupId>com.fasterxml.jackson.core</groupId>
	    <artifactId>jackson-databind</artifactId>
	    <version>2.9.3</version>
	</dependency>
	
	<dependency>
	    <groupId>com.fasterxml.jackson.core</groupId>
	    <artifactId>jackson-core</artifactId>
	    <version>2.9.3</version>
	</dependency>
	
	<dependency>
	    <groupId>com.fasterxml.jackson.core</groupId>
	    <artifactId>jackson-annotations</artifactId>
	    <version>2.9.3</version>
	</dependency>

3.3、Gson【根据场景使用】

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

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.2</version>
</dependency>

3.4、FastJson【根据场景使用】

Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。无依赖,不需要例外额外的jar,能够直接跑在JDK上。
FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。有的版本存在高危漏洞,不建议生产使用。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.70</version>
</dependency>

4、FastJson常用的JSON格式转换

	/**
     * 把JSON字符串解析为JSONObject或者JSONArray 
     * @param text
     * @return
     */
    public static final Object parse(String text);

    /**
     * 把JSON字符串解析成JSONObject,要注意:json字符串与json对象是不一样的
     * @param text
     * @return
     */
    public static final JSONObject parseObject(String text);

    /**
     * 把JSON字符串解析为JavaBean 
     * @param text
     * @param clazz
     * @param <T>
     * @return
     */
    public static final <T> T parseObject(String text, Class<T> clazz);

    /**
     * 把JSON字符串解析成JSONArray 
     * @param text
     * @return
     */
    public static final JSONArray parseArray(String text);

    /**
     * 把JSON字符串解析成JavaBean集合,也即是List集合 
     * @param text
     * @param clazz
     * @param <T>
     * @return
     */
    public static final <T> List<T> parseArray(String text, Class<T> clazz);

    /**
     * 将JavaBean序列化为JSON字符串
     * @param object
     * @return
     */
    public static final String toJSONString(Object object);

    /**
     * 将JavaBean序列化为带格式的JSON字符串
     * @param object
     * @param prettyFormat
     * @return
     */
    public static final String toJSONString(Object object, boolean prettyFormat);

    /**
     * 将JavaBean转换为JSONObject或者JSONArray。
     * @param javaObject
     * @return
     */
    public static final Object toJSON(Object javaObject);

4.1、测试案例

Student类

@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Student 
    /**
     * 学号
     */
    int id;

    /**
     * 姓名
     */
    String name;

    /**
     * 兴趣爱好
     */
    List<String> hobbys;


Teacher类

@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Teacher 
    /**
     * 教师编号
     */
    int id;

    /**
     * 姓名
     */
    String name;

    /**
     * 班级学生集合
     */
    List<Student> students;

    /**
     * 兴趣爱好
     */
    List<String> hobbys;

定义json字符串,中间的双引号需要转义

String jsonStr = "\\"id\\":1001,\\"name\\":\\"庞老师\\",\\"students\\":[\\"id\\":1,\\"name\\":\\"王同学\\",\\"hobbys\\":[\\"听歌\\",\\"唱歌\\",\\"写歌\\"],\\"id\\":2,\\"name\\":\\"韩同学\\",\\"hobbys\\":[\\"篮球\\",\\"排球\\",\\"足球\\"]],\\"hobbys\\":[\\"带孩子\\",\\"接孩子\\",\\"码代码\\"]";";

json在线格式

4.2、将JSON格式的字符串转换为json对象

//定义json字符串,中间的双引号需要转义
String jsonStr = "\\"id\\":1001,\\"name\\":\\"庞老师\\",\\"students\\":[\\"id\\":1,\\"name\\":\\"王同学\\",\\"hobbys\\":[\\"听歌\\",\\"唱歌\\",\\"写歌\\"],\\"id\\":2,\\"name\\":\\"韩同学\\",\\"hobbys\\":[\\"篮球\\",\\"排球\\",\\"足球\\"]],\\"hobbys\\":[\\"带孩子\\",\\"接孩子\\",\\"码代码\\"]";
//将json字符串转成json对象,parseObject
JSONObject jsonObject = JSON.parseObject(jsonStr);
System.out.println(jsonObject.toJSONString());
//输出结果
"hobbys":["带孩子","接孩子","码代码"],"name":"庞老师","students":["hobbys":["听歌","唱歌","写歌"],"name":"王同学","id":1,"hobbys":["篮球","排球","足球"],"name":"韩同学","id":2],"id":1001

从输出结果能看出,JSON对象是无序的。

4.3、将JSON字符串或者JSON对象转成Java对象

		//定义json字符串,中间的双引号需要转义
        String jsonStr = "\\"id\\":1001,\\"name\\":\\"庞老师\\",\\"students\\":[\\"id\\":1,\\"name\\":\\"王同学\\",\\"hobbys\\":[\\"听歌\\",\\"唱歌\\",\\"写歌\\"],\\"id\\":2,\\"name\\":\\"韩同学\\",\\"hobbys\\":[\\"篮球\\",\\"排球\\",\\"足球\\"]],\\"hobbys\\":[\\"带孩子\\",\\"接孩子\\",\\"码代码\\"]";

        //将json字符串转成json对象,parseObject
        JSONObject jsonObject = JSON.parseObject(jsonStr);

        //将json对象转成java对象

        //toJavaObject,参数1【json对象】,参数2 【javaBean】
        Teacher teacher1 = JSON.toJavaObject(jsonObject,Teacher.class);
        System.out.println(teacher1.toString());

        //parseObject,参数1【json字符串】,参数2 new TypeReference<【javaBean】>()
        Teacher teacher2 = JSON.parseObject(jsonStr,new TypeReference<Teacher>());
        System.out.println(teacher2);

        //parseObject,参数1【json字符串】,参数2 【javaBean】
        Teacher teacher3 = JSON.parseObject(jsonStr,Teacher.class);
        System.out.println(teacher3);
//输出结果
Teacher(id=1001, name=庞老师, students=[Student(id=1, name=王同学, hobbys=[听歌, 唱歌, 写歌]), Student(id=2, name=韩同学, hobbys=[篮球, 排球, 足球])], hobbys=[带孩子, 接孩子, 码代码])
Teacher(id=1001, name=庞老师, students=[Student(id=1, name=王同学, hobbys=[听歌, 唱歌, 写歌]), Student(id=2, name=韩同学, hobbys=[篮球, 排球, 足球])], hobbys=[带孩子, 接孩子, 码代码])
Teacher(id=1001, name=庞老师, students=[Student(id=1, name=王同学, hobbys=[听歌, 唱歌, 写歌]), Student(id=2, name=韩同学, hobbys=[篮球, 排球, 足球])], hobbys=[带孩子, 接孩子, 码代码])

4.4、将Java对象转换成JSON对象,toJSONString

static void test2()
        Teacher teacher = new Teacher();
        teacher.setId(1002);
        teacher.setName("王老师");
        List<Student> students = new ArrayList<>();
        List<String> hobbys = new ArrayList<>();
        hobbys.add("篮球");
        hobbys.add("排球");
        hobbys.add("足球");
        students.add(new Student(1,"张三",hobbys));
        students.add(new Student(2,"李四",hobbys));
        teacher.setStudents(students);
        teacher.setHobbys(hobbys);

        //将java对象转换成JSON对象,toJSON
        JSONObject jsonObject = (JSONObject) JSON.toJSON(teacher);
        System.out.println(jsonObject.toJSONString());
        
		//输出
		"hobbys":["篮球","排球","足球"],"name":"王老师","students":["hobbys":["篮球","排球","足球"],"name":"张三","id":1,"hobbys":["篮球","排球","足球"],"name":"李四","id":2],"id":1002

        //获取json对象中的某属性值,getString
        System.out.println("id:" + jsonObject.getString("id"));
        System.out.println("name:" + jsonObject.getString("name"));
        System.out.println("students:" + jsonObject.getString("students"));
        System.out.println("hobbys:" + jsonObject.getString("hobbys"));

		//输出
		id:1002
		name:王老师
		students:["hobbys":["篮球","排球","足球"],"name":"张三","id":1,"hobbys":["篮球","排球","足球"],"name":"李四","id":2]
		hobbys:["篮球","排球","足球"]

        //将java对象转换成JSON字符串,toJSONString
        String jsonStr1 = JSON.toJSONString(teacher);
        System.out.println(jsonStr1.toString());
        String jsonStr2 = JSONObject.toJSONString(teacher);
        System.out.println(jsonStr2.toString());
        String jsonStr3 = new JSONObject().toJSONString(teacher);
        System.out.println(jsonStr3.toString());
        String jsonStr4 = jsonObject.toJSONString(teacher);
        System.out.println(jsonStr4.toString());
		
		//输出
		"hobbys":["篮球","排球","足球"],"id":1002,"name":"王老师","students":["hobbys":["篮球","排球","足球"],"id":1,"name":"张三","hobbys":["篮球","排球","足球"],"id":2,"name":"李四"]
		"hobbys":["篮球","排球","足球"],"id":1002,"name":"王老师","students":["hobbys":["篮球","排球","足球"],"id":1,"name":"张三","hobbys":["篮球","排球","足球"],"id":2,"name":"李四"]
		"hobbys":["篮球","排球","足球"],"id":1002,"name":"王老师","students":["hobbys":["篮球","排球","足球"],"id":1,"name":"张三","hobbys"查看详情  

json对象与字符串之间的相互转换

<html><head><metaname="viewport"content="width=device-width"/><title>JSON对象与字符串之间的相互转换</title><scriptsrc="~/Js/jquery-1.8.0.js"></script><script>varuser 查看详情

java基础基本数据类型包装类int与string之间的相互转换

为什么会有基本类型包装类?将基本类型数据类型封装成对象,这样的好处可以在对象中定义更多方法操作该数据。包装类常用的操作就是用于基本数据类型与字符串之间的转换问题:inta=100;为什么不能使用Strings=(String)a;Strings... 查看详情

fastjsonjson对象及javabean之间的相互转换

...<T>这个类,使用泛型可以更加清晰/***json字符串-简单对象与JavaBean_obj之间的转换*/publicstaticvoidtestJSONStrToJavaBeanObj(){Studentstudent=JSON.parseO 查看详情

js中js数组对象与json之间的转换

...json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键。例如:JSON字符串:varstr1=‘{"name":"cxh","sex":"man"}‘;JSON对象:varstr2={"name":"cxh","sex":"man"};一、JSON字符串转换为JSON对象... 查看详情

json字符串与json对象的相互转换

什么是JSON?JSON指的是JavaScript对象表示法(JavaScriptObjectNotation)JSON是轻量级的文本数据交换格式JSON独立于语言*JSON具有自我描述性,更易理解*JSON使用JavaScript语法来描述数据对象,但是JSON仍然独立于语言和平台。JSON解析器和JSO... 查看详情

javascriptjson字符串与对象相互转换

  在实际项目中,经常遇到字符格式的问题,记下来以便日后方便查看。用到两个函数:JSON.stringify()和JSON.parse()。  使用ajax向后台请求数据,后台给前端返回数据,明明后端脚本写的是json函数处理后的json格式,但是前端... 查看详情

java里面json和java对象之间的相互转换

1.把java对象列表转换为json对象数组,并转为字符串    JSONArrayarray= JSONArray.fromObject(list);    Stringjsonstr=array.toString(); 2.把java对象转换成json对象,并转化为字符串   查看详情

python对象与json相互转换的方法

...对于python来讲,将类转化为json数据以及将json数据转化为对象是一件非常容易的事情。下面给出两者转化的方法?12345678910111213141516171819202122232425262728293031323334353637#-*-coding:UTF-8-*-importjson  #自定义类classMyC 查看详情

json的string字符串与java的list列表对象的相互转换

在前端:1.如果json是List对象转换的,可以直接遍历json,读取数据。2.如果是需要把前端的List对象转换为json传到后台,param是ajax的参数,那么转换如下所示:varjsonStr=JSON.stringify(list);varparam={};param.jsonStr=jsonStr;在后台:1.把String转... 查看详情

java将json字符串转换成对象批量存储数据

参考技术A使用toJSONString()或者全局方法JSON.stringify()。将json字符串转换为json对象的方法。在数据传输过程中,json是以文本,即字符串的形式传递的,JS操作的是JSON对象,JSON对象和JSON字符串之间的相互转换是关键。 查看详情

fastjson对于json格式字符串json对象及javabean之间的相互转换

...三个类:JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换。JSONObject:fastJson提供的json对象。JSONArray:fastJson提供json数组对象。我们可以把JSONObject当成一个Map<String,Object>来看,只是JSONObject 查看详情

javascript之json[4]parse()和stringify()-json字符串和javascript对象数据之间的相互转换

JavaScript之JSON[4]parse()和stringify()-JSON字符串和JavaScript对象数据之间的相互转换1、JSON.parse()JSON.parse()方法用于将一个JSON字符串解析为一个JavaScript对象。JSON字符串必须使用双引号包括属性名和字符串值,不能使用单引号或无引号。... 查看详情

数据集和json相互转换

...DELPHI原生类实现数据集和JSON相互转换JSON二要素:数组和对象。对象可以包含数组,数组可以包含对象。无层数限制。OLEVARIANT也类似,OLEVARIANT的一个元素又可以是OLEVARIANT,且无层数限制。XML亦类似。这也是它们能序列一切对象... 查看详情

数据集和json相互转换

...I原生类实现数据集和JSON相互转换 JSON二要素:数组和对象。对象可以包含数组,数组可以包含对象。无层数限制。OLEVARIANT也类似,OLEVARIANT的一个元素又可以是OLEVARIANT,且无层数限制。XML亦类似。这也是它们能序列一切对象... 查看详情

json对象和字符串之间的相互转换

比如有两个变量,我要将a转换成字符串,将b转换成JSON对象: vara={"name":"tom","sex":"男","age":"24"}; varb=‘{"name":"Mike","sex":"女","age":"29"}‘;在Firefox,chrome,opera,safari,ie9,ie8等高级浏览器直接可以用JSON对象的stringify()和parse( 查看详情

js中实现json对象和json字符串之间的相互转换

...firefox,chrome,opera,safari,ie8+),浏览器自己提供了JSON对象,其中的parse和stringify方法实现了JSON对象和JSON字符串之间的相互转换,例如://JSON对象转JSON字符串,输出:"{"name":"zhangsan","age":10,"birthday":"2017-08-15T07:09:48.7 查看详情

java对象与json对象之间的转换

jar包:import net.sf.json.JSONObject;1.解析json字符串将json字符串转换为json对象,然后再解析json对象:。JSONObjectjsonObject=JSONObject.fromObject(jsonStr); 根据json中的键得到它的值Stringname=jsonObject.getString("name");intage 查看详情