zoukankan      html  css  js  c++  java
  • Json数据的序列化与反序列化的三种经常用法介绍

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

    还请各位读者批判性对待。。。

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

    的比較。

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

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

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


    首先。这些工具都能够到对应的官网中下载。

    下面给出我所用到的jar包的下载链接:

    1)标准JSON所用到的jar包:http://download.csdn.net/detail/caihongshijie6/6701285

    2)gson所用到的jar包:http://download.csdn.net/detail/caihongshijie6/7260481

    3)fastjson所用到的jar包:http://download.csdn.net/detail/caihongshijie6/7260485


    一、对于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的使用方式非常像。可是在一些细节方面上还是用有差别的。

    这些细节上的差别在server与client的数据进行交互的时候可能产生的影响是非常大的。还请各位读者认真思考在使用。个人比較倾向于使用fastjson,个人觉得他在一些细节方面处理得要比google的gson处理得好。

    。。


    四、三者之间的比較

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

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


    五、写在最后

    很多其它的仅仅是还请各位读者到对应的官网去查找对应的教程。

    假设有错误还请多多包涵而且批评指出(不要吐槽的太厉害哈~~~~吐舌头)



    六、源代码下载

    http://download.csdn.net/detail/caihongshijie6/7260637














  • 相关阅读:
    Linux下多线程查看工具(pstree、ps、pstack)
    linux的netstat命令详解
    linux的netstat命令详解
    实例解说Linux命令行uniq
    实例解说Linux命令行uniq
    实例解说Linux命令行uniq
    linux之sort用法
    linux之sort用法
    linux之sort用法
    oracle服务器和客户端字符集的查看和修改
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5159877.html
Copyright © 2011-2022 走看看