一、JSON概述
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,与开发语言无关。 JSON 易于阅读和编写,同时也易于机器解析和生成,因此常用来在前后端进行数据交换。
JSON 的数据结构
对象(object):一个对象包含一系列非排序的键/值对,一个对象以 {
开始,并以 }
结束。每个键/值对之间使用 :
分区。多个键值对之间通过 ,
分割。需要注意的是JSON 的键是一个 String
类型的字符串。
JSON 值的格式
值(value):可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套使用。
二、JSON数据结构举例
下面是一个 JSON 数据格式的例子
{
"array": [1, 2, 3],
"boolean": true,
"null": null,
"number": 123,
"object": {
"a": "b",
"c": "d",
"e": "f"
},
"string": "Hello World"
}
array
:值是一个整数类型的数组boolean
:值是一个布尔型的值null
:JSON 数据格式中的值允许为 nullnumber
:值一个数值,可以是整数也可以是浮点数object
:值是一个 JSON 对象string
:值是一个字符串
三、在Java中使用JSONObject
这里以 Maven 的形式创建项目,如果你对 Maven 还不是很了解,可以下载对应的 jar 包。
在 pom.xml
中引入 JSONObject
依赖
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180130</version>
</dependency>
编写测试方法 jsonObjectTest()
public static void jsonObjectTest() {
JSONObject jsonObject = new JSONObject();
Object obj = null;
jsonObject.put("name", "张三");
jsonObject.put("age", 20);
jsonObject.put("birth", "1998-01-01");
jsonObject.put("haveCar", obj);
jsonObject.put("hasGirlfriend", true);
jsonObject.put("likes", new String[]{"看电影", "看书"});
if(!jsonObject.isNull("name")) {
System.out.println(jsonObject.getString("name")); // 获取某个键对应的值
}
System.out.println(jsonObject.toString()); // 输出 JSON 字符串
}
运行上面的代码输出的是不规则的字符串,你可以到https://jsoneditoronline.org/上对 JSON 数据进行格式化,下面是其显示效果
在字符串输出的时候会发现,输出的字符串与数据存储的顺序可能是不一致的。原因是调用jsonObject.put()
方法的时候,其底层是一个 HashMap
,数据被存到了HashMap
中。 HashMap
根据键的哈希码来决定键的位置,所以可能会出现上面的问题。下面是源代码
既然jsonObject.put()
方法的底层是对 HashMap
的操作,那么能否将一个 HashMap
转换成 JSON 数据呢?答案是可以的。原因是 JSONObject
类提供了一个构造函数,这个构造函数中接收的正是一个 Map
。下面是源代码:
四、JavaBean TO JSON(JSONObject
)
在前后端交换数据的时候,后端通常会使用一个 JavaBean 把数据封装一下,然后将这个 JavaBean 转成 JSON 数据。下面我们就来这么做
JavaBean 对象User
public class User {
private String name;
private int age;
private String[] likes;
// 省略 get 与 set 方法
}
编写测试方法 beanToJsonTest()
public static void beanToJsonTest() {
User user = new User();
user.setName("张三");
user.setAge(20);
user.setLikes(new String[]{"看电影", "看书"});
JSONObject jsonObject = new JSONObject(user);
System.out.println(jsonObject.toString());
}
有兴趣的可以查看一下源码这个过程是如何完成的。
五、在Java中使用Gson
GSON 是 Google 的一个开源项目,其主要特点是可以将 JavaBean 转换成 JSON 数据,也可以将 JSON 数据转换成 JavaBean。
在 pom.xml
中引入 Gson
依赖
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
JavaBean TO JSON(GSON):
测试方法beanToJsonTest()
public static void beanToJsonTest() {
User user = new User();
user.setName("张三");
user.setAge(20);
user.setLike(new String[]{"看电影", "看书"});
/**
* 使用GsonBuilder 可以作一些额外处理,比如格式化输出,预处理等
*
* GsonBuilder gsonBuilder = new GsonBuilder();
* gsonBuilder.setPrettyPrinting();
* Gson gson = gsonBuilder.create();
*/
Gson gson = new Gson();
System.out.println(gson.toJson(user));
}
JSON TO JavaBean(GSON):
改写 User
类(添加 Date
属性)
public class User {
private String name;
private int age;
private String[] likes;
private Date birth;
// 省略 get 与 set 方法
}
测试方法jsonToBeanTest()
public static void jsonToBeanTest() {
String jsonStr = "{\"name\":\"李四\",\"age\":22
, \"like\":[\"看电影\",\"看书\"],\"birth\":\"1996-01-01\"}";
GsonBuilder gsonBuilder = new GsonBuilder();
// 设置日期转换格式
gsonBuilder.setDateFormat("yyyy-MM--dd");
Gson gson = gsonBuilder.create();
User user = gson.fromJson(jsonStr, User.class);
System.out.println(user.getBirth().toLocaleString());
System.out.println(user.getLikes()[1]);
}
PS:
现在 fastjson
好像使用的挺多的,fastjson
以速度快、使用简单、功能完备等优点深受广大程序员喜欢。有机会的话,还是要多了解一些。