jackson包提供了java對象與json相互轉換的API。
jackson轉換機制
Jackson要求java對象是一個POJO對象,即它是一個普通JavaBean對象。此外,如果字段是用private修飾的,則必須有getXXX()方法,否則字段用public修飾。
json常見格式如下
{
"key1" : value,
"key2" : [...],
"key3" : {...}
}
jackson把JavaBean對象的每個字段映射為json的鍵,json鍵值由JavaBean的getXXX()方法確定。
json鍵值從形式上看,可以分為基本類型(字符串、數值)、數組、字典。當JavaBean的字段聲明為基本類型時對應json的基本類型,當JavaBean聲明為數組或鏈表時對應json的數組類型,當JavaBean聲明為字典或對象時對應json的字典類型。
序列化
定義一個符合JavaBean規則的類
package com.weixia.Json;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class Bean {
private String name;
private int[] stature;
private Friend friend;
private ArrayList<String> song;
private Map<String,Integer> score = new HashMap<String,Integer>();
public Bean(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setStature(int[] stature) {
this.stature = stature;
}
public int[] getStature() {
return this.stature;
}
public void setSong(ArrayList<String> song) {
this.song = song;
}
public ArrayList<String> getSong() {
return this.song;
}
public void setFriend(Friend friend) {
this.friend = friend;
}
public Friend getFriend() {
return this.friend;
}
public void addScore(String subject,Integer score) {
this.score.put(subject, score);
}
public Map getScore() {
return this.score;
}
}
class Friend {
public String name;
public int age;
}
將Bean對象序列化為json如下
package com.weixia.Json;
import java.util.ArrayList;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
public class App
{
public static void main( String[] args ) throws Exception
{
Bean bean = new Bean("Album");
ObjectMapper mapper = new ObjectMapper();
bean.setStature(new int[] {88,60,89});
ArrayList<String> song = new ArrayList<String>();
song.add("奇異恩典");
song.add("東京的都");
bean.setSong(song);
Friend friend = new Friend();
friend.name = "小明";
friend.age = 24;
bean.setFriend(friend);
bean.addScore("Math", 100);
bean.addScore("PE", 88);
mapper.configure(SerializationFeature.INDENT_OUTPUT, true); //格式化輸出
mapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true); //鍵按自然順序輸出
mapper.setSerializationInclusion(Include.NON_EMPTY); //忽略POJO中屬性為空的字段
mapper.writeValue(System.out, bean);
}
}
反序列化
json文件如下:
{
"name": "weixia",
"age": 24,
"stature":[89,66,89],
"friend":{
"name":"zhiye",
"age":24
},
"test":""
}
定義一個符合JaveBean規則的類
package com.weixia.Json;
public class People {
private String name;
private int age;
private Friend friend;
private int[] stature;
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public Friend getFriend() {
return this.friend;
}
public int[] getStature() {
return this.stature;
}
}
class Friend {
public String name;
public int age;
}
將json反序列化為java對象
package com.weixia.Json;
import java.io.File;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Json2Bean {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //忽略未知的屬性
People people = mapper.readValue(new File("F:\\test.json"), People.class);
System.out.println(people.getName());
System.out.println(people.getAge());
System.out.println(people.getFriend());
int[] stature = people.getStature();
for (int num : stature) {
System.out.println(num);
}
}
}