首页 > 其他分享 >Json数据的序列化与反序列化的三种常用方法介绍

Json数据的序列化与反序列化的三种常用方法介绍

时间:2023-05-07 22:09:10浏览次数:43  
标签:JSON List System Person Json 三种 println 序列化 out


以下内容是本作者从官网中看相应的教程后所做的demo,其体现了作者对相关知识点的个人理解。。作者才疏学浅,难免会有理解不到位的地方。。还请各位读者批判性对待。。。

       本文主要介绍在Json数据的序列化与反序列化的过程中我经常用到的三种工具的基本使用方法,及其他们之间

的比较。。。希望能够对读者们有一些帮助。。。

这里介绍到的三种解析与生成Json数据的方法分别是:标准JSON解析与生成方法、使用gson解析与生成JSON数据

、使用fastJsson解析与生成JSON数据。


首先,这些工具都可以到相应的官网中下载。以下给出我所用到的jar包的下载链接:


一、对于JSON数据的描述

       JSON是一种轻量级的数据交换格式(个人认为在很多方面上,其优于XML)。我个人将其数据形式总结如下:

{}表示一个对象,以  键:值  对的形式给出对象的内部成员及成员变量的值。多个内部成员之间用 逗号,来隔开。

集合和数组都用[]来表示。

       更详尽的关于JSON的描述请参考其官网:http://www.json.org/   (里面也有各种各样的解析工具)



二、使用标准JSON的解析与生成方法

 1、首先写一个我们会用到的pojo类


public class Person {

	private int id;
	private String name;
	private String address;
	
	public Person() {
		
	}

	public Person(int id, String name, String address) {
		super();
		this.id = id;
		this.name = name;
		this.address = address;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", address=" + address
				+ "]";
	}
	
	
	
}


2、使用标准JSON进行生成与解析


package com.njupt.pojo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class Main {

	public static void main(String[] args) {
		
		/**
		 * 生成JSON字符串
		 * 
		 */
		//对象
		Person person = new Person(1, "haungjundong","beijing");
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("hjd", person);
//		System.out.println("--------------");
//		System.out.println(jsonObject.toString());
//		System.out.println("--------------");
		
		
		//基本数据类型
		jsonObject.put("int", 123);
//		System.out.println("--------------");
//		System.out.println(jsonObject.toString());
//		System.out.println("--------------");
		
		jsonObject.put("string", "hello world");
//		System.out.println("--------------");
//		System.out.println(jsonObject.toString());
//		System.out.println("--------------");
		
		//数组
		int arr[] = new int[10];
		for(int i = 0 ; i < 10 ; ++i){
			arr[i] = i;
		}
		jsonObject.put("arr", arr);
//		System.out.println("--------------");
//		System.out.println(jsonObject.toString());
//		System.out.println("--------------");
		
		/**
		 * 生成集合类型数据(1)
		 * 为什么不使用List<基本类型>来距离呢???
		 * 因为"基本类型的集合"已经有一种形式来表示了:-------->数组
		 * 如果一定要的话,轻易List<Integer>,然后做一个demo
		 */
		List<String> strList = new ArrayList<String>();
		for(int i = 0 ; i < 10 ; ++i){
			strList.add("str" + i);
		}
		jsonObject.put("strList", strList);
//		System.out.println("--------------");
//		System.out.println(jsonObject.toString());
//		System.out.println("--------------");
		
		//生成集合类型数据(2)
		List<Person> personList = new ArrayList<Person>();
		for(int i = 0 ; i < 10 ; ++i){
			personList.add(new Person(i, "hjd" + i, "beijing" + i));
		}
		jsonObject.put("personList", personList);
//		System.out.println("--------------");
//		System.out.println(jsonObject.toString());
//		System.out.println("--------------");
		
		/**
		 * 生成集合类型数据(3)
		 * 
		 * 1)
		 * Caused by: java.lang.ClassCastException: 
		 * JSON keys must be strings.------->JSON对象中的key必须是一个String类型的(字符串)
		 * 
		 * 2)对于下面,可以这样理解(可能有一点不太准确,但是方便理解)
		 * map是一个对象,key为其内部成员,value是key的值
		 */
		List<Map> mapList = new ArrayList<Map>();
		for(int i = 0 ; i < 10 ; ++i){
			Map map = new HashMap<String, Integer>();
			map.put("" + i, 10+i);
			
			mapList.add(map);
		}
		jsonObject.put("mapList", mapList);
		System.out.println("--------------");
		System.out.println(jsonObject.toString());
		System.out.println("--------------");
		

		System.out.println("------------------->解析json字符串");
		String jsonString = jsonObject.toString();//将jsonObject转换成json字符串
		
		
		JSONObject jsonObject2 = JSONObject.fromObject(jsonString);//利用json字符串生成json对象
		
		//解析Person对象
		Person person2 = new Person();
		
//		JSONObject personObject = (Person) jsonObject2.get("hjd");//*****这种写法是错的,原生的json的解析方法并不支持将json字符串自动转成相应的对象...
		JSONObject personObject = (JSONObject) jsonObject2.get("hjd");//第一种写法
//		JSONObject personObject = jsonObject2.getJSONObject("hjd");//第二种写法
		person2.setId(personObject.getInt("id"));
		person2.setName(personObject.getString("name"));
		person2.setAddress(personObject.getString("address"));
		System.out.println("--------------->person2: " + person2);
		
//		System.out.println("person2.getId(): " + person2.getId() + ",person2.getAddress(): " + person2.getAddress() + ",person2.getName()" + person2.getName());

		//解析基本数据类型
		int num = jsonObject2.getInt("int");
//		System.out.println("---->num: " + num);
		
		
		//解析基本类型的数组数组
		JSONArray arrArray = jsonObject2.getJSONArray("arr");
		int size = arrArray.size();
		int arr2[] = new int[size];
		for(int i = 0 ; i < size ; ++i){
			arr2[i] = arrArray.getInt(i);
		}
//		System.out.println(Arrays.toString(arr2));
		
		//解析List<String>
		JSONArray strArray = jsonObject2.getJSONArray("strList");
		List<String> strList2 = new ArrayList<String>();
		int size2 = strArray.size();
		for(int i = 0 ; i < size2 ; ++i){
			strList2.add(strArray.getString(i));
		}
//		System.out.println("---------->" + strList2);
		
		
		//解析List<Person>
		JSONArray personArray = jsonObject2.getJSONArray("personList");
		List<Person> personList2 = new ArrayList<Person>();
		int size3 = personArray.size();
		for(int i = 0 ; i< size3 ; ++i){
			JSONObject jObject = personArray.getJSONObject(i);
			Person p = new Person();
			
			p.setId(jObject.getInt("id"));
			p.setName(jObject.getString("name"));
			p.setAddress(jObject.getString("address"));
			
			personList2.add(p);
		}
		
//		System.out.println("----------->" + personList2);
		
		
		//解析List<Map>
		JSONArray mapArray = jsonObject2.getJSONArray("mapList");
		List<Map> mapList2 = new ArrayList<Map>();
		int size4 = mapArray.size();
		for(int i = 0 ; i < size4 ; ++i){
			JSONObject jo = mapArray.getJSONObject(i);
			Map m = new HashMap<String, Integer>();
			m.put("" + i, jo.getInt("" + i));
			
			mapList2.add(m);
		}
		System.out.println("--------------->" + mapList2);
	}
}


小结一下:使用标准JSON进行解析时,主要用到的API如下:

生成:


Person person = new Person(1, "haungjundong","beijing");
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("hjd", person);


解析时:举例如下

[]:jsonObject2.getJSONArray("arr");

{}:jsonObject2.getJSONObject("hjd");

基本数据类型:jsonObject2.getInt("int");


jsonObject.toString() ---->>将json对象转换成json格式的字符串

JSONObject jsonObject2 = JSONObject.fromObject(jsonString); -------->>利用json字符串生成json对象

二、使用gson进行生成与解析

1、Person类的代码同上


2、使用gson进行生成与解析


import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.google.gson.Gson;


public class Main {

	public static void main(String[] args) {
		
		/**
		 * 使用gson来生成JSON字符串
		 */
		//对象
		Person person = new Person(1, "haungjundong","beijing");
		
		Gson gson = new Gson();
		String personStr = gson.toJson(person);
//		System.out.println( "----------->" + personStr);
		
		Person person2 = gson.fromJson(personStr, Person.class);
//		System.out.println("------>person2: " + person2);
		
		//数组
		int arr[] = new int[10];
		for(int i = 0 ; i < 10 ; ++i){
			arr[i] = i;
		}
		String arrStr = gson.toJson(arr);
//		System.out.println(arrStr);
		
		int arr2[] = gson.fromJson(arrStr,int[].class);//****这是要注意的地方之一..
//	    System.out.println(Arrays.toString(arr2));
		
		
		/**
		 * 生成集合类型数据(1)
		 * 
		 * 无论是List<String>还是List<Person>还是List<Map>
		 * 其利用json字符串生成对象的时候,其类型都是List.class
		 */
		List<String> strList = new ArrayList<String>();
		for(int i = 0 ; i < 10 ; ++i){
			strList.add("str" + i);
		}
		String strListStr = gson.toJson(strList);
//		System.out.println("----------->" + strListStr);
		
		List<String> strList2 = gson.fromJson(strListStr, List.class);
//		System.out.println(strList2);
		
		//生成集合类型数据(2)
		List<Person> personList = new ArrayList<Person>();
		for(int i = 0 ; i < 10 ; ++i){
			personList.add(new Person(i, "hjd" + i, "beijing" + i));
		}
		String personListJsonStr = gson.toJson(personList);
//		System.out.println(personListJsonStr);
		
		List<Person> personList2 = gson.fromJson(personListJsonStr, List.class);
		/**
		 * [{id=0.0, name=hjd0, address=beijing0}, {id=1.0, name=hjd1, address=beijing1}, {id=2.0, name=hjd2, address=beijing2}, {id=3.0, name=hjd3, address=beijing3}, {id=4.0, name=hjd4, address=beijing4}, {id=5.0, name=hjd5, address=beijing5}, {id=6.0, name=hjd6, address=beijing6}, {id=7.0, name=hjd7, address=beijing7}, {id=8.0, name=hjd8, address=beijing8}, {id=9.0, name=hjd9, address=beijing9}]
		 */
//		System.out.println(personList2);
		
		/**
		 * 生成集合类型数据(3)
		 * 
		 * 1)
		 * Caused by: java.lang.ClassCastException: 
		 * JSON keys must be strings.------->JSON对象中的key必须是一个String类型的(字符串)
		 * 
		 * 2)对于下面,可以这样理解(可能有一点不太准确,但是方便理解)
		 * map是一个对象,key为其内部成员,value是key的值
		 */
		List<Map> mapList = new ArrayList<Map>();
		for(int i = 0 ; i < 10 ; ++i){
			Map map = new HashMap<String, Integer>();
			map.put("" + i, 10+i);
			
			mapList.add(map);
		}
		String mapListJsonStr = gson.toJson(mapList);
//		System.out.println(mapListJsonStr);
	
		List<Map> mapList2 = gson.fromJson(mapListJsonStr, List.class);
//		System.out.println(mapList2);
	}
}



小结:

1)生成JSON数据:举例

Gson gson = new Gson();
String personStr = gson.toJson(person);


2)解析JSON数据:举例


Person person2 = gson.fromJson(personStr, Person.class);

Person person2 = gson.fromJson(personStr, Person.class);

特别需要注意的是:

基本类型数据的解析方式: int[].class

List类型数据的解析方式: List.class  (无论是List<String>还是List<Map>还是,List<Person>都是用的是这个)


其实大家可以发现,我们在生成与解析的时候只是调一下gson这个对象的方法而已。除此之外,专门生成一个

gson对象似乎没有什么用。。。

是的,我是这么认为的。我想阿里巴巴的那帮哥们也是这么想的。所以在对性能进行进一步优化的同时,他们

把解析的方法对做成静态的了。。。这样就不需要专门生成一个对象才能使用相应的方法


三、使用fastjson进行生成与解析、

特别提醒:使用fastjson将json字符串转成List<javabean>对象时,尽量使用以下方式

List<Person> persons2 = JSON.parseArray(jsonString,Person.class);


1、Person类的代码是一样的


2、


import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;



public class Main {

	public static void main(String[] args) {
		
		/**
		 * 使用gson来生成JSON字符串
		 */
		//对象
		Person person = new Person(1, "haungjundong","beijing");
		String personStr = JSON.toJSONString(person);//利用对象生成JSON字符串
//		System.out.println(personStr);
		Person person2 = JSON.parseObject(personStr, Person.class);//利用JSON字符串生成Person对象
//		System.out.println(person2);
		
		
		//数组
		int arr[] = new int[10];
		for(int i = 0 ; i < 10 ; ++i){
			arr[i] = i;
		}
		String arrStr = JSON.toJSONString(arr);
//		System.out.println(arrStr);
		int arr2[] = JSON.parseObject(arrStr, int[].class);
//		System.out.println(Arrays.toString(arr2));
		
		/**
		 * 生成集合类型数据(1)
		 * 
		 * 无论是List<String>还是List<Person>还是List<Map>
		 * 其利用json字符串生成对象的时候,其类型都是List.class
		 */
		List<String> strList = new ArrayList<String>();
		for(int i = 0 ; i < 10 ; ++i){
			strList.add("str" + i);
		}
		String strListJSONStr = JSON.toJSONString(strList);
//		System.out.println(strListJSONStr);
		List<String> strList2 = JSON.parseObject(strListJSONStr, List.class);
//		System.out.println(strList2);
		
		//生成集合类型数据(2)
		List<Person> personList = new ArrayList<Person>();
		for(int i = 0 ; i < 10 ; ++i){
			personList.add(new Person(i, "hjd" + i, "beijing" + i));
		}
		String personListJSONStr = JSON.toJSONString(personList);
		/**
		 * 以下语句的打印结果
		 * [{"address":"beijing0","id":0,"name":"hjd0"},{"address":"beijing1","id":1,"name":"hjd1"},{"address":"beijing2","id":2,"name":"hjd2"},{"address":"beijing3","id":3,"name":"hjd3"},{"address":"beijing4","id":4,"name":"hjd4"},{"address":"beijing5","id":5,"name":"hjd5"},{"address":"beijing6","id":6,"name":"hjd6"},{"address":"beijing7","id":7,"name":"hjd7"},{"address":"beijing8","id":8,"name":"hjd8"},{"address":"beijing9","id":9,"name":"hjd9"}]
		 */
//		System.out.println(personListJSONStr);
		List<Person> personList2 = JSON.parseObject(personListJSONStr, List.class);
		/**
		 * 以下语句的打印结果
		 * [Person [id=0, name=hjd0, address=beijing0], Person [id=1, name=hjd1, address=beijing1], Person [id=2, name=hjd2, address=beijing2], Person [id=3, name=hjd3, address=beijing3], Person [id=4, name=hjd4, address=beijing4], Person [id=5, name=hjd5, address=beijing5], Person [id=6, name=hjd6, address=beijing6], Person [id=7, name=hjd7, address=beijing7], Person [id=8, name=hjd8, address=beijing8], Person [id=9, name=hjd9, address=beijing9]]
		 */
//		System.out.println(personList);
		
		/**
		 * 生成集合类型数据(3)
		 * 
		 * 1)
		 * Caused by: java.lang.ClassCastException: 
		 * JSON keys must be strings.------->JSON对象中的key必须是一个String类型的(字符串)
		 * 
		 * 2)对于下面,可以这样理解(可能有一点不太准确,但是方便理解)
		 * map是一个对象,key为其内部成员,value是key的值
		 */
		List<Map> mapList = new ArrayList<Map>();
		for(int i = 0 ; i < 10 ; ++i){
			Map map = new HashMap<String, Integer>();
			map.put("" + i, 10+i);
			
			mapList.add(map);
		}
		String mapListJSONStr = JSON.toJSONString(mapList);
//		System.out.println(mapListJSONStr);
		List<Map> mapList2 = JSON.parseObject(mapListJSONStr, List.class);
//		System.out.println(mapList2);
		
	}
}


小结:

1)生成JSON格式的数据


JSON.toJSONString(person);//利用对象生成JSON字符串


2)解析JSON格式的数据


JSON.parseObject(arrStr, int[].class);


注意:

fastjson与gson的使用方式很像。但是在一些细节方面上还是用有区别的。这些细节上的差别在服务器与客户端的数据进行交互的时候可能产生的影响是很大的。还请各位读者认真思考在使用。个人比较倾向于使用fastjson,个人认为他在一些细节方面处理得要比google的gson处理得好。。。


四、三者之间的比较

标准JSON的生成与解析方法与gson、fastjson之间最大的区别就在于:标准JSON的生成与解析方法无法利用JSON

数据自动生成相应的对象和数据。使用标准JSON进行生成相应的对象时,只能是一个一个的获取器成员变量的数据,然后一个一个地set()。。


五、写在最后

更多的只是还请各位读者到相应的官网去查找相应的教程。。如果有错误还请多多包涵并且批评指出(不要吐槽的太厉害哈~~~~

)



标签:JSON,List,System,Person,Json,三种,println,序列化,out
From: https://blog.51cto.com/u_5290007/6252580

相关文章

  • js基础---对象的序列化(JSON)与map
    序列化概念json工具类就是那个转换字符串的方法调用json静态方法,不需要new。注意事项将对象转换为json后再转换为对象,相当于做了一次深复制。当对象的字符串key属性满足不了需求时,可用map的对象属性作为keymap属性和方法map与数组之间的转换......
  • 使用 @ResponseBody 注解直接返回json字符串结果中文出现乱码
    在类上直接使用@RestController,这样子,里面所有的方法都只会返回json字符串了,不用再每一个都添加@ResponseBody!我们在前后端分离开发中,一般都使用@RestController,十分便捷!@RestControllerpublicclassUserController{//produces:指定响应体返回类型和编码@Request......
  • 在web中使用json json异常
    今天在web中使用Jacjson将后端对象转换为json类型传输,在pom中导入依赖,代码中也可以引用,启动tomcat后发现启动失败,报jackson的异常。以为是jacson和spring的版本冲突问题,换版本,也是不能启动。换了fastjson后在代码中导入包,发现不能正常弹出方法引用,突然发觉,可能是tomcat的lib目录没......
  • burp的三种日志格式
    1、xml格式(1)items作为根节点,具有burpVersion、exportTime两个属性,分别表示burp版本和导出时间(2)item作为itmes的子节点,表示一组请求-响应(3)item内包括多个字节点:time,表示时间,cst格式url,host,例如static.deepl.com,该节点还具有一个属性ipportprotocol,例如httpsmethod......
  • java类序列化和反序列化
    参考:https://zhuanlan.zhihu.com/p/144535172?utm_id=0https://blog.csdn.net/qq_42617455/article/details/1096223901、问题解答(1)序列化和反序列化都需要哪些操作对象要实现java.io.Serializable接口增加序列化ID(privatestaticfinallongserialVersionUID)转化成便于传......
  • django内置序列化组件(drf前身)
    目录一、django内置序列化组件(drf前身)一、django内置序列化组件(drf前身)一、django内置序列化组件(drf前身)这里的内置序列化组件,其实就是实现将后端数据,存放到字典中或是存放到列表中有序输出。这里是我们用JsonResponse模块自己实现的代码'''前后端分离的项目视图函数......
  • 使用python脚本传递参数:(三种方式可收藏)
    背景:使用python脚本传递参数在实际工作过程中还是比较常用,以下提供了好几种的实现方式:一、使用sys.argv的数组传入说明:使用sys.argv必须按照先后的顺序传入对应的参数;sys.argv则封装了传入的参数数据,作为数组的方式已经传入importsysprint("传入参数的总长度为:",len(sys.ar......
  • shell jq处理json字符串
    1.1工具介绍自己用shell处理json字符串的时候,开发输入格式的不通会导致解析字符串有问题,所以这里用到了jq工具jq是一款命令行下处理JSON数据的工具。其可以接受标准输入,命令管道或者文件中的JSON数据,经过一系列的过滤器(filters)和表达式的转后形成我们需要的数据结构并将......
  • struts2+Spring+Hibernate+Jquery (json)
          Struts2文件的上传和下载http://wing929.javaeye.com/blog/216118基于struts+spring+hibernate+jquery的jmesa的分页实现样例http://wing929.javaeye.com/blog/216292http://hi.baidu.com/angel_lishiwen/blog/item/cf266627fcb59327d4074288.html stru......
  • Struts2+extjs (Json)
            web开发过程中,经常需要使用Ajax进行数据的交互。ExtJs表单提交默认使用异步的方式,若使用Struts2的Action进行数据的处理,则需要返回一个Json数据客户端才会收到服务器的处理结果,我们使用jsonplugin插件从Action中返回结果给用户,下面我们就来实现这一方法: 1、下......