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
Json数据的序列化与反序列化的三种经常用法介绍的更多相关文章
- 对 JSON 数据进行序列化和反序列化
如何:对 JSON 数据进行序列化和反序列化 2017/03/30 作者 JSON(JavaScript 对象符号)是一种高效的数据编码格式,可用于在客户端浏览器和支持 AJAX 的 Web 服务之间 ...
- 详解电子表格中的json数据:序列化与反序列化
从XML到JSON 当下应用开发常见的B/S架构之下,我们会遇到很多需要进行前后端数据传输的场景.而在这个传输的过程中,数据通过何种格式传输.方式是否迅速便捷.书写方式是否简单易学,都成为了程序员在开 ...
- c#中对json数据的序列化和反序列化(笔记)
今天遇到在后台中要获取json格式数据里的某些值,网上查了些资料: string jsonstr = _vCustomerService.LoadCustomerbyNumTotalData(quer ...
- Json 序列化以及反序列化的三种方式(二)
1.什么是JSON? Json[javascript对象表示方法],它是一个轻量级的数据交换格式,我们可以很简单的来读取和写它,并且它很容易被计算机转化和生成,它是完全独立于语言的 2.Json支持下 ...
- C# 编写通用的JSON数据进行序列化和反序列化
注意事项:使用JSON系列化和反系列化,必须要添加引用System.Runtime.Serialization. 1.通用类代码如下: /// <summary> /// JSON序 ...
- fastjson生成和解析json数据,序列化和反序列化数据
本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<M ...
- asp.net的JSON数据进行序列化和反序列化
先要引用在程序集 System.Web.Extensions.dll 的类库,在类中 using System.Web.Script.Serialization 命名空间. 1.定义一个强类型的类(m ...
- java分享第十三天(fastjson生成和解析json数据,序列化和反序列化数据)
fastjson简介:Fastjson是一个Java语言编写的高性能功能完善的JSON库.fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jack ...
- C#json数据的序列化和反序列化(将数据转换为对象或对象集合)
引用 System.Runtime.Serialization.Json
随机推荐
- struts2标签#、%、$取值
转自:https://blog.csdn.net/kosum/article/details/21375635 首先了解下OGNL的概念: OGNL是Object-Graph Navigation L ...
- POJ 2248 搜索
剪枝: 1.从后向前枚举 2.迭代加深 然后就0msAC了 //By SiriusRen #include <cstdio> using namespace std; int n,T,s[ ...
- yarn平台的任务调度和执行过程
- SecondaryNameNode合并元信息过程
- Android RecyclerView和ScrollView嵌套使用
我们的recyclerView有多个layoutmanager,通过重写layoutmanager的方法就可以让recyclerView和ScrollView嵌套了.但是请注意,如果recyclerV ...
- 如何知道 CPU 是否支持虚拟化技术(VT)
作者: Sk 译者: LCTT geekpi 我们已经知道如何检查你的 Linux 操作系统是 32 位还是 64 位以及如何知道你的 Linux 系统是物理机还是虚拟机.今天,我们将学习另一个有用的 ...
- NodeJS学习笔记 (14)URL查询字符串-querystring(ok)
模块概述 在nodejs中,提供了querystring这个模块,用来做url查询参数的解析,使用非常简单. 模块总共有四个方法,绝大部分时,我们只会用到 .parse(). **.stringify ...
- 用VUE做网站后台
介绍: 这是一个用vuejs2.0和element搭建的后台管理界面. 相关技术: vuejs2.0:渐进式JavaScript框架,易用.灵活.高效,似乎任何规模的应用都适用. element:基于 ...
- [POI2009]KON-Ticket Inspector(二维前缀和+DP)
题意 有n个车站,现在有一辆火车从1到n驶过,给出aij代表从i站上车j站下车的人的个数.列车行驶过程中你有K次检票机会,所有当前在车上的人会被检票,问最多能检多少个不同的人的票 (n<=600 ...
- linux驱动编译时候出现的问题
1.在编译驱动的时候,提示错误,找不到<asm/xxxx.h>这些类的头文件? 答:因为在内核编译的时候,会在内核目录的include中创建一个asm文件再软链接到对应的一些架构.比如我当 ...