jackson序列化和反序列化Json


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);
		}
	}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM