Json
- 概念
- JavaScript對象表示法 JavaScript Object Notation
- var p = {“name”:“張三”,“age”:23,“gender”:“男”};
- Json 多用於存儲和交換文本信息的語法
- 用於傳輸數據
- 相較於XML,JSON比之更小,傳輸速度更快,且更易解析
- 語法
-
基本規則
-
數據在名稱/值對中 :Json數據是由鍵值對構成的
- 鍵用引號(單引號或雙引號都可)引起來,也可以不使用引號
- 值可以是
- 數字(整數或浮點數)
- 字符串(在雙引號中)
- 邏輯值(true 或 false)
- 數組(在方括號中){“persons”:[{},{}…]}
- 對象(在花括號中){“address”:{“provice”:“陝西”,…}}
- null
-
數據由逗號分隔 :多個鍵值對之間由逗號分隔
-
花括號保存對象 :使用{}定義Json格式
-
方括號保存數組 :[]
-
-
獲取數據
- json對象.鍵名
- json對象[“鍵名”]
- 數組對象[索引]
-
- JavaScript對象表示法 JavaScript Object Notation
<script>
// 1.定義基本格式
var person = {"name":"tom",age:23,'gender':true};
// alert(person);
// 基本格式的獲取
// var age = person.age;
var age = person["age"];
//遍歷json對象數據
for (var key in person){
//默認key是字符串格式,所以不能使用person.key獲取值,只能使用person[key]獲取
// alert(key+":"+person.key);
// alert(key+":"+person[key]);
}
// alert(age);
// 2.定義嵌套格式
var persons = {"persons":[
{"name":"zhangsan","age":23,"gender":"man"},
{"name":"lisi","age":24,"gender":"woman"}]
};
// alert(persons);
// 數組格式json對象數據的獲取
var gender = persons.persons[1].gender;
// alert(gender);
// 3.定義嵌套格式(數組中存放了多個對象)
var ps = [{"name":"zhangsan","age":23,"gender":"man"},
{"name":"lisi","age":24,"gender":"woman"}];
// alert(ps);
var name = ps[0].name;
// alert(name);
//數組內容的遍歷 需要雙重循環
for (var i = 0; i < ps.length; i++) {
var p = ps[i];
for (var key in p){
alert(key+":"+p[key]);
}
}
</script>
JSON數據與Java對象的相互轉換
要想完成轉換,一般需要使用JSON解析器;常見的解析器有:Jsonlib,Gson,fastjson,jackson由於jackson解析器是流行框架中內置的JSON解析器,所以先學習jackson
- JSON轉爲Java對象(瞭解)
使用步驟與Java轉換爲JSON相類似- 導入jackson相關jar包
- 創建jackson核心對象ObjectMapper
- 調用ObjectMapper的相關方法進行轉換
轉換方法是readValue(json數據,Class類型)
public void JsonToJava() throws IOException {
// 準備一個json數據
String json = "{\"gender\":\"男\",\"name\":\"張三\",\"age\":23}";
// 創建objectMapper對象
ObjectMapper mapper = new ObjectMapper();
// 調用方法轉換爲Java對象
Person person = mapper.readValue(json, Person.class);
// 打印轉換的Java對象
// Person{name='張三', age=23, gender='男', birthday=null}
System.out.println(person);
}
- Java對象轉爲JSON
使用步驟- 導入jackson相關jar包
- 創建jackson核心對象ObjectMapper
- 調用ObjectMapper的相關方法進行轉換
轉換方法:
* writeValue(參數1,obj) :
參數1:
File :將obj對象轉換爲JSON字符串,並保存到指定的文件中
Writer :將obj對象轉換爲JSON字符串,並將json數據填充到字符輸出流中
OutputStream :將obj對象轉換爲JSON字符串,並將json數據填充到字節輸出流中
* writeValueAsString(obj) :將對象直接轉爲json字符串並返回
//Java對象轉爲JSON字符串
@Test
public void javaToJson() throws IOException {
// 1.創建Person對象
Person person = new Person();
person.setName("張三");
person.setAge(23);
person.setGender("男");
// 2.創建Jackson核心對象ObjectMapper
ObjectMapper mapper = new ObjectMapper();
// 3.轉換
/*
轉換方法:
writeValue(參數1,obj) :
參數1:
File :將obj對象轉換爲JSON字符串,並保存到指定的文件中
Writer :將obj對象轉換爲JSON字符串,並將json數據填充到字符輸出流中
OutputStream :將obj對象轉換爲JSON字符串,並將json數據填充到字節輸出流中
writeValueAsString(obj) :將對象直接轉爲json字符串並返回
*/
//String json = mapper.writeValueAsString(person);
// {"name":"張三","age":23,"gender":"男"}
//System.out.println(json);
// 將json數據保存在d盤下的a.txt文件中
mapper.writeValue(new File("d://a.txt"),person);
}
註解
1. @JsonIgnore:排除屬性
2. @JsonFormat:屬性值得到格式化
* 爲待轉換的person對象中添加Data屬性,然後重新做Json轉換
直接打印轉換的結果爲
{"name":"李四","age":31,"gender":"男","birthday":1571018034025}
可以發現birthday的值並不是想要的結果,可以有兩種做法
1.忽略該屬性,不將該屬性轉換爲json數據 :
在person對象的該屬性值前加註解 @JsonIgnore
此時轉換的結果爲
{"name":"李四","age":31,"gender":"男"}
2.設置一下該屬性的格式 :
在person對象的該屬性值前加註解 @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
此時的轉換結果爲
{"name":"李四","age":31,"gender":"男","birthday":"2019-10-14 02:10:14"}
複雜的java對象轉換
1. List轉換爲Json :轉換的是數組形式[{},{},...]
2. Map轉換爲Json :轉換結果與person對像轉換的類似{鍵值對}