一、什么是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对象之间切换。