下面内容是本作者从官网中看对应的教程后所做的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

Json数据的序列化与反序列化的三种经常用法介绍的更多相关文章

  1. 对 JSON 数据进行序列化和反序列化

    如何:对 JSON 数据进行序列化和反序列化 2017/03/30 作者 JSON(JavaScript 对象符号)是一种高效的数据编码格式,可用于在客户端浏览器和支持 AJAX 的 Web 服务之间 ...

  2. 详解电子表格中的json数据:序列化与反序列化

    从XML到JSON 当下应用开发常见的B/S架构之下,我们会遇到很多需要进行前后端数据传输的场景.而在这个传输的过程中,数据通过何种格式传输.方式是否迅速便捷.书写方式是否简单易学,都成为了程序员在开 ...

  3. c#中对json数据的序列化和反序列化(笔记)

    今天遇到在后台中要获取json格式数据里的某些值,网上查了些资料: string jsonstr = _vCustomerService.LoadCustomerbyNumTotalData(quer ...

  4. Json 序列化以及反序列化的三种方式(二)

    1.什么是JSON? Json[javascript对象表示方法],它是一个轻量级的数据交换格式,我们可以很简单的来读取和写它,并且它很容易被计算机转化和生成,它是完全独立于语言的 2.Json支持下 ...

  5. C# 编写通用的JSON数据进行序列化和反序列化

    注意事项:使用JSON系列化和反系列化,必须要添加引用System.Runtime.Serialization. 1.通用类代码如下: /// <summary>    /// JSON序 ...

  6. fastjson生成和解析json数据,序列化和反序列化数据

    本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<M ...

  7. asp.net的JSON数据进行序列化和反序列化

    先要引用在程序集 System.Web.Extensions.dll 的类库,在类中 using System.Web.Script.Serialization 命名空间. 1.定义一个强类型的类(m ...

  8. java分享第十三天(fastjson生成和解析json数据,序列化和反序列化数据)

     fastjson简介:Fastjson是一个Java语言编写的高性能功能完善的JSON库.fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jack ...

  9. C#json数据的序列化和反序列化(将数据转换为对象或对象集合)

    引用 System.Runtime.Serialization.Json

随机推荐

  1. 智课雅思词汇---十一、spect是什么意思

    智课雅思词汇---十一.spect是什么意思 一.总结 一句话总结:词根:spect, speci, spec(spic, spi, spy) = to look, to see 看 1.port是什 ...

  2. django 笔记7 多对多

    多对多 方法一 :双外键关联 自定义关系表 自定义 class Host(models.Model): nid = models.AutoField(primary_key=True) hostnam ...

  3. Oracle数据库Helper类

    using System;using System.Collections.Generic;using System.Data;using System.Data.OleDb;using System ...

  4. Python有了asyncio和aiohttp在爬虫这类型IO任务中多线程/多进程还有存在的必要吗?

    最近正在学习Python中的异步编程,看了一些博客后做了一些小测验:对比asyncio+aiohttp的爬虫和asyncio+aiohttp+concurrent.futures(线程池/进程池)在效 ...

  5. highGUI图形用户界面

    #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> using namespace ...

  6. iOS开发—— Couldn't add the Keychain Item

    报错:*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Couldn ...

  7. POJ 3630 Phone List(字典树)

    题意 题意:t个case(1<=t<=40),给你n个电话号码(电话号码长度<10)(1 ≤ n ≤ 10000),如果有电话号码是另一个电话号码的前缀,则称这个通讯录是不相容的,判 ...

  8. Python 上下文(Context)学习笔记

    前言 最早接触到with语句的时候,是初学python,对文件进行读写的时候,当时文件读写一般都是用open()函数来对文件进行读写,为了防止读写的过程中出现错误,也为了让代码更加的pythonic, ...

  9. 今日SGU 6.5

    sgu 160 题意:给你n个数字 数字范围 1 到 m 问你从中取出任意数量的数字使得这些数字的积取模m最大 收获:dp,记录dp的路径 #include<bits/stdc++.h> ...

  10. javaweb——登陆权限过滤器的编写

    http://blog.csdn.net/lzc4869/article/details/50935858