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
随机推荐
- 如何在阿里云服务器里配置iis 搭建web服务
IIS,互联网信息服务,一种Web服务组件,利用它,我们可以打开asp.php这些搭建网页所用的文件. 工具/原料 域名 服务器 方法/步骤 登录服务器. 点击开始—>服务器 ...
- pyspark.mllib.feature module
Feature Extraction Feature Extraction converts vague features in the raw data into concrete numbers ...
- linux下修改完profile文件的环境变量后如何立即生效
方法1: 让/etc/profile文件修改后立即生效 ,可以使用如下命令: # . /etc/profile 注意: . 和 /etc/profile 有空格 方法2: 让/etc/profile文 ...
- 2013亚洲区域赛长沙站 ZOJ 3732 Graph Reconstruction
题目链接 Graph Reconstruction 题意 给你无向图每个点的度数, 问是否存在唯一解, 存在输出唯一解, 多解输出两个, 无解输出IMPOSSIBLE 思路 这里用到了 Havel-H ...
- Map<String,String>转换json字符串
import java.util.HashMap; import java.util.Map; import net.sf.json.JSONObject; public class testJson ...
- Linux下通过rdesktop连接Windows远程桌面
rdesktop是linux下支持Windows远程桌面连接的客户端程序,在linux系统下可通过它远程访问Windows桌面,支持多种版本.rdesktop是sourceforge下支持GPL协议的 ...
- selenium自动化框架介绍------unittest版本
首先说下unittest的两个问题:1.未实现失败重跑 2.未实现远程的分布式(即多线程呼起多台远程计算机,并行进行用例的执行), 为什么要使用框架: 比较方便,只需要写用例就行,而不用考虑结构.还 ...
- Java 调用对象方法的执行过程
弄清调用对象方法的执行过程十分重要.下面是调用过程的详细描述: 1) 编译器查看对象的声明类型和方法名.假设调用x.f(param),且隐式参数x声明为C类的对象.需要注意的是:有可能存在多个名为f, ...
- [NOIP2009提高组]最优贸易
题目:洛谷P1073.Vijos P1754.codevs1173. 题目大意:有n点m边的图,边分有向和无向.每个点有一个价格,用这个价格可以买入或卖出一个东西.一个人从1出发,要到n,途中可以买入 ...
- 阿里云上如何找到虚拟主机和用户名登录FileZilla软件?
0.少玩游戏 1.登录阿里云官网 :https://www.aliyun.com/ 2.点击自己的旁边的名称进入进入自己的页面 3.购买的域名和主机会在这里显示,点击域名与网站(万网)>云虚拟主 ...