一、什么是JSON
1、【定义】
JSON(JavaScript Object Notation)是JavaScript对象表示法,用于存储和交换文本信息的语法,类似XML,但比XML更小、更灵活。它是独立的语言,具有自我描述性,所以更易理解。
JSON使用JavaScript语法来描述数据对象,但SJON仍然独立于语言平台。JSON解析器和JSON库支持许多不同的编程语言。
2、【例子】
{
"employees":[
{"fristName": "Li", "lastName":"min"},
{"fristName": "Zhang", "lastName":"feng"},
{"fristName": "Li", "lastName":"yunfeng"},
]
}
这个例子中,对象"employee"包含三个对象数组,其中数组中的每个对象代表一个人名称信息。
3、【语法】
JSON语法是JavaScript对象表示法语法的子集:
(1)数据在键值对中
(2)数据由逗号分隔
(3)花括号保存对象
(4)方括号保存数组
4、【理解】
(1)数据在键值对中
这里的“数据”可以理解为“数据值”,比如键值对"firstName":"Li",数据(值)为Li,它相当于java语句的String firstName = "Li"。其中数据可以是整数或浮点数,也可以是字符串(在双引号中),亦可以是布尔值(true或false)、数组(在方括号中)、对象(右花括号中)和null。
(2)数据由逗号分隔
例如"firstName":"Li","lastName":"min",这两个键值对使用逗号隔开,相当于定义了两个变量:
String firstName = "Li";
String lastName = "min";
(3)花括号保存对象
例如{"firstName":"Li", "lastName":"min"}就是一个对象,使用java可这样理解
private class Employee
{
String firstName = null;
String lastName = null;
public Employee(String firstName, String lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
}
其中{"firstName":"Li", "lastName":"min"}相当于new Employee("Li", "min")
(4)方括号保存数组
例如"employees":[{"fristName": "Li", "lastName":"min"},{"fristName": "Li", "lastName":"yunfeng"}]就是一个数组,使用java可这样理解
Employee employee1 = new Employee("Li", "min");
Employee employee2 = new Employee("Li", "yunfeng");
Employee[] employees = new Employee[]{employee1, empolyee2};
5、【备注】
关于JSON的基本知识可能见w3school,网址http://www.w3school.com.cn/json/index.asp
二、JSON解析器
聪明的你一定会想JSON结构是否可以转换为java对象?答案是肯定的,这正是该文重点讲解的内容。既然JSON是一个字符串,那么完全可以自己对字符串解析,当然重新发明轮子的事尽量少做,除非新发明的轮子更合理。现有的轮子:
(1)JSON官方网站提供了官方的Java实现(org.json),用于解析和系列化。
(2)StringTree,这个解析器的特点“简单”,JSONReader负责解析 、JSONWriter负责序列化。
(3)JSEL,不仅可以解析同时还可以处理JSON中的注释,甚至内处理一些简单的表达式,接口简单、性能不错。
除此之外,还有大名鼎鼎的jackson、GSON等等。
至于GSON与其它解析器之间的优缺点对比,请读者自己进行测试验证。
三、GSON使用说明简介
1、【GSON简介】
GSON是用于Json和Java对象之间相互转换的类库,即便Java类的源码还未实现,它是一个开源项目,其网址为http://code.google.com/p/google-gson。
此处读者可能存在疑惑,Java类的源码还未实现,通过GSON就可以转换为这个Java对象?用个例子说明吧:
(1)有一个JSON字符串{name:'GREETINGS', source:'guest'}
(2)若把这个JSON结构转换为一个Demo对象,通常会为Demo类定义两个字段name和source,但下面的Demo类定义并没有name和source字段定义实现,如下:
public class Demo
{
}
(3)运行测试方法会发现可正常工作
public static void main(String[] args)
{
String s = "{name:'GREETINGS', source:'guest'}";
Gson gson = new Gson();
Demo demo = gson.fromJson(s, Demo.class);
}
2、【Gson目标】
可以使用new Gson()或GsonBuilder的create()方法创建GSON对象,由于GSON对象不会保存状态,用户可以无限制地对JSON进行序列化和反序列化操作。通过GSON对象可以轻易实现如下功能:
(1)输出简洁易读的JSON代码
(2)支持任意复杂的对象
(3)允许用户对特殊的表达式进行转换
(4)提供尽量简单的装配操作,就像操作构造器和toString()方法一样在JSON和Java对象之间切换。