JSON
一、概念
JavaScript Object Notation,意為JavaScript對象表示法,是一種存儲和交換信息的數據格式,比xml更小、更快、更易於解析
二、語法
1. 基本規則
- 數據在鍵值對中,數據由鍵值對表示
- 鍵:鍵可以用引號也可以不用引號
- 值:取值可以為:
- 數字(整數、浮點數),直接寫
- 字符串(在引號中)
- 邏輯值(true or false)
- 數組(在方括號中)
- 對象(json對象,在花括號中)
- null
- 數據由逗號分隔
- 花括號保存對象
- 方括號保存數組
2. 獲取數據
-
json對象.鍵名
-
json對象[”鍵名“]:注意有引號
-
數組對象[索引]
for(key in person) { alert(key + " : " + person[key]); }
三、JSON和java對象的轉換
JSON解析器:Jsonlib(官方)、Gson(Google)、fastjson(Alibaba)、Jackson
1. java對象轉為JSON
-
導入Jackson的相關jar包
-
創建Jackson核心對象ObjectMapper
-
writeValue(參數, obj):參數的取值
-
File:將obj對象轉換為json字符串,並保存到指定的文件
-
Writer:將obj對象轉換為json字符串,並填充到指定的字符輸出流
-
OutputStream:將obj對象轉換為json字符串,並填充到指定的字節輸出流
-
-
writeValueAsString(obj):將java對象轉為json字符串
-
-
調用ObjectMapper的相關方法進行轉換
Person person = new Person("David", 18, "男"); ObjectMapper mapper = new ObjectMapper(); String json_person = mapper.writeValueAsString(person); mapper.writeValue(new File("d://a.txt"), person);
-
注解:當java對象有的成員變量是Date類型的時候,如果直接轉為JSON得到的值是毫秒值,可以使用注解解決這個問題:在定義的類的成員變量上添加這兩個注解:
-
@JsonIgnore:表示在轉為JSON時不考慮這個鍵值對
-
@JsonFormat:表示在轉為JSON時可以轉為指定的格式
@JsonFormat(pattern = "yyyy-mm-dd")
-
-
復雜的java對象:
- List:轉為一個數組:[]
- Map:轉為一個JSON對象:{}
2. JSON轉為java對象
-
創建Jackson核心對象ObjectMapper
-
ObjectMapper對象調用readValue方法:readValue(json字符串數據,Class)
String json = "{\"name\":\"david\",\"age\":18,\"gender\":\"男\"}";// 鍵值對要用雙引號、單引號報錯 ObjectMapper mapper = new ObjectMapper(); Person person = mapper.readValue(json, Person.class);
四、Demo:用戶名是否存在的校驗
實現邏輯:
- 當輸入用戶名的文本框失去焦點(blur事件),向服務器發送異步請求
- 服務器端接收請求,查詢數據庫,將結果填充進字符輸入流
客戶端:
$("#username").blur(function () {
var username = $(this).val();
$.get("findUsernameServlet", {username:username}, function (data) {// data 是服務端響應的數據
var span = $("#span_username");
if (data.userExist) {
span.css("color", "red");
span.html(data.msg);
} else {
span.css("color", "green");
span.html(data.msg);
}
}, "json");// 格式為json
});
服務端:
response.setContentType("text/html;charset=utf-8");
String username = request.getParameter("username");
Map<String, Object> map = new HashMap<String, Object>();
if ("cat".equals(username)) {
// 用戶名已經存在,應該去查找數據庫判斷
map.put("userExist", true);
map.put("msg", "用戶名已經存在");
} else {
// 用戶名沒有存在
map.put("userExist", false);
map.put("msg", "用戶名可用");
}
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(response.getWriter(), map);
注意:需要把服務器寫會的數據當做JSON處理,兩種方法:
- 在get/post請求里指定數據格式 “json”
- 在服務端指定編碼、格式
response.setContentType("application/json;charset=utf-8");