JSON
JSON 是一種輕量級(jí)易與解析的數(shù)據(jù)格式胜嗓,它按照 js 的對(duì)象和數(shù)組的字面
量格式來書寫榜轿。 現(xiàn)在 JSON 的光環(huán)已經(jīng)逐漸超越了 XML亥贸,各大網(wǎng)站提供的數(shù)據(jù)
接口一般都是 JSON器虾。
下面的代碼是用 JSON 編寫的用戶列表:
[
{
"name": "john",
"age": 15
},
{
"name": "wall",
"age": 22
},
{
"name": "ben",
"age": 8
}
]
jquery 1.4 以后對(duì) json
格式變嚴(yán)格了,也就是說必須要這種格式的{"鍵":"值
","鍵":"值"};像原來的{鍵:值,鍵:值}和{'鍵':'值','鍵':'值'}這種都是錯(cuò)誤的蹦锋,不合標(biāo)準(zhǔn)兆沙,所以
jquery 返回 error
如"{\"success\":true,\"msg\":\"success\"}",如果說是boolean
類型莉掂,則不用加 引號(hào)葛圃,其它的鍵/值都需要加引號(hào)。
1. JSON 是什么憎妙?
JSON: JavaScript 對(duì)象表示法(JavaScript Object Notation) ,
一種輕量級(jí)的數(shù)\據(jù)交換格式, 易于人閱讀和編寫, 也易于機(jī)器解析和生成库正。用來描述數(shù)據(jù)結(jié)構(gòu),
它是基于純文本的數(shù)據(jù)格式厘唾,是一種輕量級(jí)的數(shù)據(jù)交換格式褥符。廣泛應(yīng)用于服務(wù)端與客戶端的數(shù)據(jù)交互。
JSON 是存儲(chǔ)和交換文本信息的語法阅嘶,類似 XML。
JSON 采用完全獨(dú)立于語言的文本格式载迄,也使用了類似于 C 語言家族的習(xí)
慣(包括 C, C++, C#, Java, JavaScript, Perl, Python...)這些特性使 JSON
成為理想
的數(shù)據(jù)交換語言讯柔。
JSON 是一個(gè)新的人類可讀( human readable)的數(shù)據(jù)格式,在過去幾年中已變
得非常 受歡迎护昧,尤其是在 web 開發(fā)中魂迄。
1) 基本類型
{
"name": "張三",
"age": 18,
"sex": true
}
2) 數(shù)組類型
[
{
"name": "張三",
"age": 18,
"sex": true
},
{
"name": "李四",
"age": 19,
"sex": false
}
]
3) 對(duì)象嵌套
{
"name": "teacher",
"computer": {
"CPU": "intel7",
"disk": "512G"
},
"students": [
{
"name": "張三",
"age": 18,
"sex": true
},
{
"name": "李四",
"age": 19,
"sex": false
}
]
}
2. JSON 格式
1) 兩種構(gòu)建結(jié)構(gòu)
a)、對(duì)象:"名稱/值"對(duì)的集合**(A collection of name/value
pairs)\
不同的語言中惋耙,它被理解為對(duì)象(object)捣炬,記錄(record),結(jié)構(gòu)(struct)绽榛,
字典 (dictionary)湿酸,哈希表(hash table),有鍵列表(keyed
list)灭美,或者關(guān)聯(lián)數(shù)組(associative array)推溃。
b)、數(shù)組:值的有序列表**(An ordered list of values)
**在大多數(shù)語言中届腐,它被理解為數(shù)組(array)铁坎、矢量(vector),
列表(list)或者序列
(sequence)。
經(jīng)過對(duì)象犁苏、數(shù)組 2 種結(jié)構(gòu)就可以組合成復(fù)雜的數(shù)據(jù)結(jié)構(gòu)了硬萍。
2) 具體形式
?Json 以 key-value 的形式存儲(chǔ)數(shù)據(jù)
?Key 的取值 為 String 類型;
?Value 的取值 為 String,boolean,Number,數(shù)組,Object,null;
?Json 串以{開始,以}結(jié)尾;
?Json 串中數(shù)組是以[開始,以]結(jié)尾;
?Json 串中 Object 是以{開始,以}結(jié)尾;
具體如下: [http://www.json.org/]{.underline}
a)、對(duì)象是一個(gè)無序的"名稱/值"對(duì)集合围详。一個(gè)對(duì)象以"{"開始朴乖, "}"結(jié)束。每
個(gè)名稱后跟一個(gè)":"; "名稱/值 "對(duì)之間使用","分隔寒砖。
b)赐劣、數(shù)組是值的有序集合。一個(gè)數(shù)組以"["開始哩都,
"]"結(jié)束魁兼。各值間使用","分隔。
c)漠嵌、值(value)可以是雙引號(hào)括起來的字符串(string)咐汞、數(shù)值(number)、
true儒鹿、
false化撕、 null、 對(duì)象(object)或者數(shù)組(array)约炎。這些結(jié)構(gòu)可以嵌套植阴。
d)、字符串(string)是由 0 到多個(gè) Unicode 字符組成的序列圾浅,封裝在雙引
號(hào)中, 可
以使用反斜杠'\'進(jìn)行轉(zhuǎn)義掠手。一個(gè)字符可以表示為一個(gè)單一字符的字符串。
e)狸捕、數(shù)字(number)類似 C 或者 Java 里面的數(shù)喷鸽,沒有用到的 8 進(jìn)制和 16 進(jìn)
制數(shù)除外
二、 解析方式
1. 使用 gson 處理
Gson是一個(gè) Google提供的一個(gè) Java庫,可用于將 Java對(duì)象轉(zhuǎn)換為 JSON表示灸拍。
它也可以被用來將 JSON 字符串轉(zhuǎn)換成一個(gè)等效的 Java 對(duì)象做祝。
提供易于使用的機(jī)制如 toString()和構(gòu)造函數(shù)(工廠方法)將 Java 轉(zhuǎn)換為 JSON,
反之亦然。 允許自定義表示對(duì)象鸡岗,支持任意復(fù)雜的對(duì)象,生成緊湊和可讀性的JSON
輸出.
***1) 轉(zhuǎn)為 Json 字符串
I)混槐、獲得需要的對(duì)象:
Student stu = new Student();
stu.setName("張三");
stu.setAge(18);
II)、格式化為字符串
Gson gson = new Gson();
//將 對(duì)象 轉(zhuǎn)化成 json 字符串
String json = gson.toJson(stu)
2) 解析成 java 對(duì)象
I)轩性、 Gson 的 節(jié)點(diǎn)對(duì)象:**
JsonElement : 所有的節(jié)點(diǎn) 都是 JsonElement 對(duì)象.
JsonPrimitive : 基本的 數(shù)據(jù)類型的 節(jié)點(diǎn) 對(duì)象纵隔, JsonElement 的子類.
JsonNull : 代表 空節(jié)點(diǎn) 對(duì)象,即 有 key炮姨, value 為空捌刮, JsonElement
的子類.
JsonObject : 對(duì)象 數(shù)據(jù)類型的 節(jié)點(diǎn) 對(duì)象, JsonElement 的 子類.
JsonArray : 數(shù)組 數(shù)據(jù)類型的 節(jié)點(diǎn) 對(duì)象, JsonElement 的 子類.
II)、 JsonElement 的取值:
**JsonPrimitive : value 的 取值對(duì)應(yīng) java 的
int,double,float,long,short,boolean,char,byte,String,BigDecimal,BigI
nteger,Number
JsonObject : value 的取值對(duì)應(yīng) java 的 Object 對(duì)象.
JsonArray : value 的取值對(duì)應(yīng) java 的 List 及其子類對(duì)象.
-Json 解析成 java 對(duì)象
-Json 解析 成 List
Json 解析 成 map
-Json 節(jié)點(diǎn)解析
- Json 節(jié)點(diǎn)解析
{
"flag": true,
"data": {
"name": "張三",
"age": 18,
"sex":
}
}
解析步驟 :
①獲得解析器
--
JsonParser parser = new JsonParser();
②獲得根節(jié)點(diǎn)元素
--
JsonElement element = parser.parse(json);
③根據(jù)文檔判斷根節(jié)點(diǎn)屬于什么類型的 Gson 節(jié)點(diǎn)對(duì)象
// 假如文檔 顯示 根節(jié)點(diǎn) 為對(duì)象類型
// 獲得 根節(jié)點(diǎn) 的實(shí)際 節(jié)點(diǎn)類型
JsonObject root = element.getAsJsonObject();
④取得節(jié)點(diǎn)下的某個(gè)節(jié)點(diǎn)的 value
// 獲得 flag 節(jié)點(diǎn)的值, flag 節(jié)點(diǎn)為基本數(shù)據(jù)節(jié)點(diǎn)
JsonPrimitive flagJson = root.getAsJsonPrimitive("flag");
// 基本節(jié)點(diǎn)取值
boolean flag = flagJson.getAsBoolean();
// 獲得 data 節(jié)點(diǎn)的值舒岸, data 節(jié)點(diǎn)為 Object 數(shù)據(jù)節(jié)點(diǎn)
JsonObject dataJson = root.getAsJsonObject("data");
// 將節(jié)點(diǎn)上的數(shù)據(jù)轉(zhuǎn)換為對(duì)象
package com.shsxt.test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;
import com.google.gson.reflect.TypeToken;
import com.shsxt.model.User;
/**
* 單元測(cè)試類
* 選擇要執(zhí)行的方法绅作,右鍵,選擇Run As 或 Debug As蛾派,選擇JUnit Test執(zhí)行方法(如果沒有選擇方法俄认,則全部執(zhí)行)
* 成功:綠色个少;報(bào)錯(cuò):暗紅色
* 注:
* 1、單元測(cè)試的方法都必須加注解@Test
* 2眯杏、不能有父類
* 3夜焦、不能是靜態(tài)方法
* 4、不能有參數(shù)
* 5岂贩、返回值是void
* @author Lisa Li
*
*/
public class GsonTest {
@Test
public void test() {
// fail("Not yet implemented");
//System.out.println("Hello JUnit!");
}
/**
* 將java對(duì)象轉(zhuǎn)換成json字符串
*/
@Test
public void testJavaToJson() {
// 得到Gson對(duì)象
Gson gson = new Gson();
// JavaBean對(duì)象
User user = new User(1, "zhangsan", "123456", 18, "上海");
// 將JavaBean對(duì)象轉(zhuǎn)換為json字符串
String json = gson.toJson(user);
System.out.println(json);
// List集合
List<String> list = new ArrayList<String>();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
String json2 = gson.toJson(list);
System.out.println(json2);
// JavaBean List
List<User> userList = new ArrayList<>();
User user2 = new User(2, "lisi", "123124", 19, "北京");
User user3 = new User(3, "wangwu", "111111", 20, "杭州");
userList.add(user);
userList.add(user2);
userList.add(user3);
String json3 = gson.toJson(userList);
System.out.println(json3);
// Map
Map<String, Object> map = new HashMap<>();
map.put("name","zhansgan");
map.put("sex",true);
map.put("user", user);
map.put("userList", userList);
String json4 = gson.toJson(map);
System.out.println(json4);
Map<String, Object> map2 = new HashMap<>();
map2.put("user1", user);
map2.put("user2", user2);
map2.put("user3", user3);
String json5 = gson.toJson(map2);
System.out.println(json5);
}
/**
* 將json字符串轉(zhuǎn)換成java對(duì)象
*/
@Test
public void testJsonTtoJava() {
// 轉(zhuǎn)JavaBean
String json1 = "{\"userId\":1,\"userName\":\"zhangsan\",\"userPwd\":\"123456\",\"userAge\":18,\"address\":\"上海\"}";
User user = new Gson().fromJson(json1, User.class);
System.out.println(user.getUserName());
// 轉(zhuǎn)List
String json2 = "[\"zhangsan\",\"lisi\",\"wangwu\"]";
List<String> list = new Gson().fromJson(json2, new TypeToken<List<String>>(){}.getType());
System.out.println(list.get(0));
String json3 = "[{\"userId\":1,\"userName\":\"zhangsan\",\"userPwd\":\"123456\",\"userAge\":18,\"address\":\"上海\"},{\"userId\":2,\"userName\":\"lisi\",\"userPwd\":\"123124\",\"userAge\":19,\"address\":\"北京\"},{\"userId\":3,\"userName\":\"wangwu\",\"userPwd\":\"111111\",\"userAge\":20,\"address\":\"杭州\"}]";
List<User> userList = new Gson().fromJson(json3, new TypeToken<List<User>>(){}.getType());
System.out.println(userList.get(0));
String json4 = "{\"user1\":{\"userId\":1,\"userName\":\"zhangsan\",\"userPwd\":\"123456\",\"userAge\":18,\"address\":\"上海\"},\"user2\":{\"userId\":2,\"userName\":\"lisi\",\"userPwd\":\"123124\",\"userAge\":19,\"address\":\"北京\"},\"user3\":{\"userId\":3,\"userName\":\"wangwu\",\"userPwd\":\"111111\",\"userAge\":20,\"address\":\"杭州\"}}";
Map<String,User> map = new Gson().fromJson(json4, new TypeToken<Map<String,User>>(){}.getType());
System.out.println(map.get("user2"));
}
/**
* 節(jié)點(diǎn)解析
* {
* "userList":[
* {"userId":1,"userName":"zhangsan","userPwd":"123456","userAge":18,"address":"上海"},
* {"userId":2,"userName":"lisi","userPwd":"123124","userAge":19,"address":"北京"},
* {"userId":3,"userName":"wangwu","userPwd":"111111","userAge":20,"address":"杭州"}
* ],
* "sex":true,
* "name":"zhansgan",
* "user":{
* "userId":1,
* "userName":"zhangsan",
* "userPwd":"123456",
* "userAge":18,
* "address":"上海"
* }
* }
*
*/
@Test
public void jsonParser() {
String json = "{\"userList\":[{\"userId\":1,\"userName\":\"zhangsan\",\"userPwd\":\"123456\",\"userAge\":18,\"address\":\"上海\"},{\"userId\":2,\"userName\":\"lisi\",\"userPwd\":\"123124\",\"userAge\":19,\"address\":\"北京\"},{\"userId\":3,\"userName\":\"wangwu\",\"userPwd\":\"111111\",\"userAge\":20,\"address\":\"杭州\"}],\"sex\":true,\"name\":\"zhansgan\",\"user\":{\"userId\":1,\"userName\":\"zhangsan\",\"userPwd\":\"123456\",\"userAge\":18,\"address\":\"上海\"}}";
// 得到解析器
JsonParser parser = new JsonParser();
// 得到文檔節(jié)點(diǎn)
JsonElement jsonElement = parser.parse(json);
// 根據(jù)文檔的字符串類型判斷節(jié)點(diǎn)類型 {}對(duì)象是JsonObject類型
JsonObject root = jsonElement.getAsJsonObject();
// 開始解析文檔中的具體節(jié)點(diǎn)
// sex 布爾類型 基本數(shù)據(jù)類型
JsonPrimitive jsonPrimitive = root.getAsJsonPrimitive("sex");
boolean sex = jsonPrimitive.getAsBoolean();
System.out.println(sex);
// name 字符串 基本數(shù)據(jù)類型
JsonPrimitive jsonPrimitive2 = root.getAsJsonPrimitive("name");
String name = jsonPrimitive2.getAsString();
System.out.println(name);
// user user對(duì)象 jsonObject
JsonObject jsonObject = root.getAsJsonObject("user");
User user = new Gson().fromJson(jsonObject, User.class);
System.out.println(user);
// userList List JsonArray
JsonArray jsonArray = root.getAsJsonArray("userList");
List<User> userList = new Gson().fromJson(jsonArray, new TypeToken<List<User>>(){}.getType());
System.out.println(userList);
}
}
用戶類
package com.shsxt.model;
/**
* 用戶類
* @author Lisa Li
*
*/
public class User {
private Integer userId; // 主鍵茫经,用戶ID
private String userName; // 用戶名
private String userPwd; // 用戶密碼
private Integer userAge; // 用戶年齡
private String address; // 地址
public User() {
super();
}
public User(Integer userId, String userName, String userPwd, Integer userAge, String address) {
super();
this.userId = userId;
this.userName = userName;
this.userPwd = userPwd;
this.userAge = userAge;
this.address = address;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
public Integer getUserAge() {
return userAge;
}
public void setUserAge(Integer userAge) {
this.userAge = userAge;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName + ", userPwd=" + userPwd + ", userAge=" + userAge
+ ", address=" + address + "]";
}
}
2. 使用 fastjson 處理
阿里巴巴 fastJson 是一個(gè) Json 處理工具包,包括"序列化"和"反序列化"兩
部分萎津,它 具備如下特征:速度最快卸伞,測(cè)試表明, fastjson 具有極快的性能锉屈,超
越其他的 Java Json parser荤傲。包括自稱最快的 JackJson;功能強(qiáng)大颈渊,完全支持
Java
Bean遂黍、集合、 Map俊嗽、 日期雾家、 Enum,支持范型乌询,支持自拾裉豌研;無依賴妹田。
下載路徑:https://github.com/alibaba/fastjson/releases/tag/1.2.13
Fastjson 是一個(gè) Java 語言編寫的高性能功能完善的 JSON 庫。 fastjson 采
用獨(dú)創(chuàng)的算法鹃共,將 parse 的速度提升到極致鬼佣,超過所有 json 庫,包括曾經(jīng)號(hào)稱
最快的 JackJson霜浴。并且還超越了 google 的二進(jìn)制協(xié)議 protocol buf晶衷。
Fastjson 完
全支持 http://json.org 的標(biāo)準(zhǔn),
也是官方網(wǎng)站收錄的參考實(shí)現(xiàn)之一阴孟。支持各種
JDK 類型晌纫。包括基本類型、 JavaBean永丝、 Collection锹漱、 Map、
Enum慕嚷、泛型等哥牍。支持 JDK5毕泌、 JDK 6、 Android嗅辣、阿里云手機(jī)等環(huán)境撼泛。
1) 轉(zhuǎn)為 json 字符串
--
String jsonString = JSON.toJSONString(object);
2) 解析成對(duì)象
1). JavaBean : Person person = JSON.parseObject(jsonString, Person.class);
2). List : List listPerson =JSON.parseArray(jsonString, Person.class);
3). List:List listString = JSON.parseArray(jsonString, String.class);
4). List<Map> List<Map> listMap = JSON.parseObject(jsonString, **new
**TypeReference<List<Map>>(){});
package com.shsxt.test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.shsxt.model.User;
public class FastJsonTest {
/**
* 將java對(duì)象轉(zhuǎn)換成json格式的字符串
*/
@Test
public void testJavaToJson() {
// JavaBean對(duì)象
User user = new User(1, "zhangsan", "123456", 18, "上海");
String json1 = JSON.toJSONString(user);
System.out.println(json1);
// List集合
List<String> list = new ArrayList<String>();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
String json2 = JSON.toJSONString(list);
System.out.println(json2);
// JavaBean List
List<User> userList = new ArrayList<>();
User user2 = new User(2, "lisi", "123124", 19, "北京");
User user3 = new User(3, "wangwu", "111111", 20, "杭州");
userList.add(user);
userList.add(user2);
userList.add(user3);
String json3 = JSON.toJSONString(userList);
System.out.println(json3);
// Map
Map<String, Object> map = new HashMap<>();
map.put("name","zhansgan");
map.put("sex",true);
map.put("user", user);
map.put("userList", userList);
String json4 = JSON.toJSONString(map);
System.out.println(json4);
Map<String, Object> map2 = new HashMap<>();
map2.put("user1", user);
map2.put("user2", user2);
map2.put("user3", user3);
String json5 = JSON.toJSONString(map2);
System.out.println(json5);
List<Map<String,String>> listMap = new ArrayList<>();
Map<String, String> m1 = new HashMap<>();
m1.put("user1", "aa");
m1.put("user2", "bb");
m1.put("user3", "cc");
Map<String, String> m2 = new HashMap<>();
m2.put("user4", "dd");
m2.put("user5", "ee");
m2.put("user6", "ff");
listMap.add(m1);
listMap.add(m2);
String json6 = JSON.toJSONString(listMap);
System.out.println(json6);
}
/**
* 將json字符串轉(zhuǎn)換成java對(duì)象
*/
@Test
public void testJsonTtoJava() {
// 轉(zhuǎn)JavaBean
String json1 = "{\"userId\":1,\"userName\":\"zhangsan\",\"userPwd\":\"123456\",\"userAge\":18,\"address\":\"上海\"}";
User user = JSON.parseObject(json1, User.class);
System.out.println(user);
// 轉(zhuǎn)List
String json2 = "[\"zhangsan\",\"lisi\",\"wangwu\"]";
List<String> list = JSON.parseArray(json2,String.class);
System.out.println(list);
String json3 = "[{\"userId\":1,\"userName\":\"zhangsan\",\"userPwd\":\"123456\",\"userAge\":18,\"address\":\"上海\"},{\"userId\":2,\"userName\":\"lisi\",\"userPwd\":\"123124\",\"userAge\":19,\"address\":\"北京\"},{\"userId\":3,\"userName\":\"wangwu\",\"userPwd\":\"111111\",\"userAge\":20,\"address\":\"杭州\"}]";
List<User> userList = JSON.parseArray(json3,User.class);
System.out.println(userList);
String json4 = "[{\"user1\":\"aa\",\"user2\":\"bb\",\"user3\":\"cc\"},{\"user4\":\"dd\",\"user5\":\"ee\",\"user6\":\"ff\"}]";
List<Map<String,String>> listMap = JSON.parseObject(json4, new TypeReference<List<Map<String,String>>>(){});
System.out.println(listMap);
}
}