Json現(xiàn)在在開發(fā)中用的非常非常多,可以說無處不在,主要用于數(shù)據(jù)格式的傳輸。在十年前,還是XML一統(tǒng)天下的時候,現(xiàn)在是Json的時代了,不管是在java開發(fā)后端程序,還是js開發(fā)前端程序, 都是利用json格式來進(jìn)行數(shù)據(jù)傳輸。包括現(xiàn)在最火的RESTFul調(diào)用,格式也都是標(biāo)準(zhǔn)的Json。
到底什么是json呢?
百度百科介紹:JSON(JavaScript Object Notation, JS 對象標(biāo)記) 是一種輕量級的數(shù)據(jù)交換格式。它基于 ECMAScript 規(guī)范的一個子集,采用完全獨(dú)立于編程語言的文本格式來存儲和表示數(shù)據(jù)。簡潔和清晰的層次結(jié)構(gòu)使得 JSON 成為理想的數(shù)據(jù)交換語言。 易于人閱讀和編寫,同時也易于機(jī)器解析和生成,并有效地提升網(wǎng)絡(luò)傳輸效率。
任何支持的類型都可以通過 JSON 來表示,例如字符串、數(shù)字、對象、數(shù)組等。對象和數(shù)組是比較特殊且常用的兩種類型,且兩種對象可以相互嵌套。
表示對象,JSON最常用的格式是對象的 鍵值對,一個key對應(yīng)一個value
{"firstName": "Brett", "lastName": "McLaughlin"}
表示數(shù)組
{ "people":
[
{"firstName": "Brett","lastName":"McLaughlin" },
{"firstName":"Jason","lastName":"Hunter"}
]
}
數(shù)據(jù)格式非常簡單,簡要說明就是:
- 對象表示為鍵值對
- 數(shù)據(jù)由逗號分隔
- 花括號保存對象
- 方括號保存數(shù)組
由上面簡單的幾種格式就可以囊括所有的數(shù)據(jù)類型了。
Json和XML比較
1、可讀性
JSON和XML的可讀性可謂不相上下,一邊是簡易的語法,一邊是規(guī)范的標(biāo)簽形式,很難分出勝負(fù)。
2、可擴(kuò)展性
XML天生有很好的擴(kuò)展性,JSON當(dāng)然也有,沒有什么是XML可以擴(kuò)展而JSON卻不能擴(kuò)展的。不過JSON在Javascript主場作戰(zhàn),可以存儲Javascript復(fù)合對象,有著xml不可比擬的優(yōu)勢。
3、編碼難度
XML有豐富的編碼工具,比如Dom4j、JDom等,JSON也有提供的工具。比如JSONObject、Jackson、fastJson等等,和XML相比,都相當(dāng)簡單。
Json例子
常見的Json解析的工具比較多,這里介紹Jackson,這也是國內(nèi)外用的最多的,而且和其他工具結(jié)合最緊密的。Json在進(jìn)行傳輸時還會用在消息隊列的序列化方面,這個后面會講。阿里開源的fastjson也是非常好的工具,有興趣的可以通過度娘搜一下看看。
pom.xml引入對應(yīng)的jar包
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.4</version>
</dependency>
引入一個jar包即可
Json常用的例子就是把一個對象轉(zhuǎn)成json串,把json串轉(zhuǎn)成對應(yīng)的對象。
model對象,舉例子
public class User {
private int id;
private String name;
private Date createDate;//創(chuàng)建日期
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
//其他get、set忽略
}
這里說一個特殊情況,在實體類中定義了日期格式,轉(zhuǎn)json字符串的時候,需要指定日期格式化的格式。這里使用了
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")來指定日期的格式化格式。比較好用
Json工具類,這個可以直接拿到項目中使用
public class JsonUtil {
private static ObjectMapper objectMapper = new ObjectMapper();
/**
* 把對象轉(zhuǎn)成json串
*
* @param obj
* @return
*/
public static String toStr(Object obj) {
String json_str = "";
try {
json_str = objectMapper.writer().writeValueAsString(obj);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return json_str;
}
/**
* json轉(zhuǎn)對象
*
* @param jsonStr
* @param valueType
* @return
*/
public static <T> T toObject(String jsonStr, Class<T> valueType) {
if (objectMapper == null) {
objectMapper = new ObjectMapper();
}
try {
return objectMapper.readValue(jsonStr, valueType);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
使用例子如下:
public static void main(String[] args) {
//對象轉(zhuǎn)json
User user = new User(1, "張三", new Date());
System.out.println(JsonUtil.toStr(user));
List<User> listUser = new ArrayList<>();
listUser.add(user);
System.out.println(JsonUtil.toStr(listUser));
//json轉(zhuǎn)對象
User user2 = JsonUtil.toObject("{\"id\":1,\"name\":\"張三\",\"createDate\":\"2017-05-14 20:18:49\"}", User.class);
System.out.println(user2.toString());
List<User> list2 = JsonUtil.toObject("[{\"id\":1,\"name\":\"張三\",\"createDate\":\"2017-05-14 20:22:12\"}]", List.class);
System.out.println(list2.toString());
}
Json本身很簡單,關(guān)鍵是得用起來,記住一點(diǎn),以后在做數(shù)據(jù)傳輸接口時,首先想到的一定要是Json,而不是xml。
源碼下載
[本工程詳細(xì)源碼]
(https://github.com/chykong/java_component/tree/master/chapter1_json)