JackSon fasterxml學習

概述

Jackson框架是基於Java平臺的一套數據處理工具,被稱爲「最好的Java Json解析器」。 
Jackson框架包含了3個核心庫:streaming,databind,annotations.Jackson還包含了其它數據處理類庫,此外不做說明。
Jackson版本: 1.x (目前版本從1.1~1.9)與2.x。1.x與2.x從包的命名上能夠看出來,1.x的類庫中,包命名以:org.codehaus.jackson.xxx開頭,而2.x類庫中包命令:com.fastxml.jackson.xxx開頭html

Jackson Home Page:https://github.com/FasterXML/jackson
Jackson Wiki:http://wiki.fasterxml.com/JacksonHome
Jackson doc: https://github.com/FasterXML/jackson-docs
Jackson Download Page:http://wiki.fasterxml.com/JacksonDownloadjava


準備工做

本文全部程序都基於JDK1.7,依賴jackon的三個核心類庫:
jackson-core-2.5.3.jar
jackson-annotations-2.5.3.jar
jackson-databind-2.5.3.jarnode


Jackson處理Json

Jackson提供了三種可選的Json處理方法:流式API(Streaming API) 、樹模型(Tree Model)、數據綁定(Data Binding)。從使用角度來看,比較一下這三種處理Json的方式的特性:git

Streaming API:是效率最高的處理方式(開銷低、讀寫速度快,但程序編寫複雜度高)
Tree Model:是最靈活的處理方式
Data Binding:是最經常使用的處理方式

下面咱們經過例子程序分別使用DataBinding,TreeModel,Streaming的方式來建立和解析Json字符串github

1.DataBinding處理Json

Jackson支持Java對象與Json之間的相互轉化。java對象序列化爲json字符串,json字符串也能夠反序列化爲相同的java對象。

(1)java對象轉化成json:
Province.java
  1. package com.jackson.json.databinding;  
  2.   
  3. public class Province {  
  4.     public String name;  
  5.     public int population;  
  6.     public String[] city;     
  7. }  
package com.jackson.json.databinding;

public class Province {
    public String name;
    public int population;
    public String[] city;   
}
Country.java
  1. package com.jackson.json.databinding;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Arrays;  
  5. import java.util.Date;  
  6. import java.util.HashMap;  
  7. import java.util.List;  
  8. import java.util.Map;  
  9.   
  10. public class Country {  
  11.     // 注意:被序列化的bean的private屬性字段須要建立getter方法或者屬性字段應該爲public  
  12.     private String country_id;  
  13.     private Date birthDate;  
  14.     private List<String> nation = new ArrayList<String>();  
  15.     private String[] lakes;  
  16.     private List<Province> provinces = new ArrayList<Province>();  
  17.     private Map<String, Integer> traffic = new HashMap<String, Integer>();  
  18.   
  19.     public Country() {  
  20.         // TODO Auto-generated constructor stub  
  21.     }  
  22.   
  23.     public Country(String countryId) {  
  24.         this.country_id = countryId;  
  25.     }  
  26.   
  27.     public String getCountry_id() {  
  28.         return country_id;  
  29.     }  
  30.   
  31.     public void setCountry_id(String country_id) {  
  32.         this.country_id = country_id;  
  33.     }  
  34.   
  35.     public Date getBirthDate() {  
  36.         return birthDate;  
  37.     }  
  38.   
  39.     public void setBirthDate(Date birthDate) {  
  40.         this.birthDate = birthDate;  
  41.     }  
  42.   
  43.     public List<String> getNation() {  
  44.         return nation;  
  45.     }  
  46.   
  47.     public void setNation(List<String> nation) {  
  48.         this.nation = nation;  
  49.     }  
  50.   
  51.     public String[] getLakes() {  
  52.         return lakes;  
  53.     }  
  54.   
  55.     public void setLakes(String[] lakes) {  
  56.         this.lakes = lakes;  
  57.     }  
  58.   
  59.     public Integer get(String key) {  
  60.         return traffic.get(key);  
  61.     }  
  62.   
  63.     public Map<String, Integer> getTraffic() {  
  64.         return traffic;  
  65.     }  
  66.   
  67.     public void setTraffic(Map<String, Integer> traffic) {  
  68.         this.traffic = traffic;  
  69.     }  
  70.   
  71.     public void addTraffic(String key, Integer value) {  
  72.         traffic.put(key, value);  
  73.     }  
  74.   
  75.     public List<Province> getProvinces() {  
  76.         return provinces;  
  77.     }  
  78.   
  79.     public void setProvinces(List<Province> provinces) {  
  80.         this.provinces = provinces;  
  81.     }  
  82.   
  83.     @Override  
  84.     public String toString() {  
  85.         return 「Country [country_id=」 + country_id + 「, birthDate=」 + birthDate  
  86.                 + 」, nation=」 + nation + 「, lakes=」 + Arrays.toString(lakes)  
  87.                 + 」, province=」 + provinces + 「, traffic=」 + traffic + 「]」;  
  88.     }  
  89.   
  90. }  
package com.jackson.json.databinding;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Country {
    // 注意:被序列化的bean的private屬性字段須要建立getter方法或者屬性字段應該爲public
    private String country_id;
    private Date birthDate;
    private List<String> nation = new ArrayList<String>();
    private String[] lakes;
    private List<Province> provinces = new ArrayList<Province>();
    private Map<String, Integer> traffic = new HashMap<String, Integer>();

    public Country() {
        // TODO Auto-generated constructor stub
    }

    public Country(String countryId) {
        this.country_id = countryId;
    }

    public String getCountry_id() {
        return country_id;
    }

    public void setCountry_id(String country_id) {
        this.country_id = country_id;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }

    public List<String> getNation() {
        return nation;
    }

    public void setNation(List<String> nation) {
        this.nation = nation;
    }

    public String[] getLakes() {
        return lakes;
    }

    public void setLakes(String[] lakes) {
        this.lakes = lakes;
    }

    public Integer get(String key) {
        return traffic.get(key);
    }

    public Map<String, Integer> getTraffic() {
        return traffic;
    }

    public void setTraffic(Map<String, Integer> traffic) {
        this.traffic = traffic;
    }

    public void addTraffic(String key, Integer value) {
        traffic.put(key, value);
    }

    public List<Province> getProvinces() {
        return provinces;
    }

    public void setProvinces(List<Province> provinces) {
        this.provinces = provinces;
    }

    @Override
    public String toString() {
        return "Country [country_id=" + country_id + ", birthDate=" + birthDate
                + ", nation=" + nation + ", lakes=" + Arrays.toString(lakes)
                + ", province=" + provinces + ", traffic=" + traffic + "]";
    }

}
JavaBeanSerializeToJson.java
  1. package com.jackson.json.databinding;  
  2.   
  3. import java.io.File;  
  4. import java.text.SimpleDateFormat;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7.   
  8. import com.fasterxml.jackson.annotation.JsonInclude.Include;  
  9. import com.fasterxml.jackson.databind.ObjectMapper;  
  10. import com.fasterxml.jackson.databind.SerializationFeature;  
  11.   
  12. public class JavaBeanSerializeToJson {  
  13.   
  14.     public static void convert() throws Exception {  
  15.         // 使用ObjectMapper來轉化對象爲Json  
  16.         ObjectMapper mapper = new ObjectMapper();  
  17.         // 添加功能,讓時間格式更具備可讀性  
  18.         SimpleDateFormat dateFormat = new SimpleDateFormat(「yyyy-MM-dd」);  
  19.         mapper.setDateFormat(dateFormat);  
  20.   
  21.         Country country = new Country(「China」);  
  22.         country.setBirthDate(dateFormat.parse(」1949-10-01」));  
  23.         country.setLakes(new String[] { 「Qinghai Lake」「Poyang Lake」,  
  24.                 」Dongting Lake」「Taihu Lake」 });  
  25.   
  26.         List<String> nation = new ArrayList<String>();  
  27.         nation.add(」Han」);  
  28.         nation.add(」Meng」);  
  29.         nation.add(」Hui」);  
  30.         nation.add(」WeiWuEr」);  
  31.         nation.add(」Zang」);  
  32.         country.setNation(nation);  
  33.   
  34.         Province province = new Province();  
  35.         province.name = 」Shanxi」;  
  36.         province.population = 37751200;  
  37.         Province province2 = new Province();  
  38.         province2.name = 」ZheJiang」;  
  39.         province2.population = 55080000;  
  40.         List<Province> provinces = new ArrayList<Province>();  
  41.         provinces.add(province);  
  42.         provinces.add(province2);  
  43.         country.setProvinces(provinces);  
  44.           
  45.         country.addTraffic(」Train(KM)」112000);  
  46.         country.addTraffic(」HighWay(KM)」4240000);  
  47.         // 爲了使JSON視覺上的可讀性,增長一行以下代碼,注意,在生產中不須要這樣,由於這樣會增大Json的內容  
  48.         mapper.configure(SerializationFeature.INDENT_OUTPUT, true);  
  49.         // 配置mapper忽略空屬性  
  50.         mapper.setSerializationInclusion(Include.NON_EMPTY);  
  51.         // 默認狀況,Jackson使用Java屬性字段名稱做爲 Json的屬性名稱,也可使用Jackson annotations(註解)改變Json屬性名稱  
  52.         mapper.writeValue(new File(「country.json」), country);  
  53.     }  
  54.   
  55.     public static void main(String[] args) throws Exception {  
  56.         convert();  
  57.     }  
  58.   
  59. }  
package com.jackson.json.databinding;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public class JavaBeanSerializeToJson {

    public static void convert() throws Exception {
        // 使用ObjectMapper來轉化對象爲Json
        ObjectMapper mapper = new ObjectMapper();
        // 添加功能,讓時間格式更具備可讀性
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        mapper.setDateFormat(dateFormat);

        Country country = new Country("China");
        country.setBirthDate(dateFormat.parse("1949-10-01"));
        country.setLakes(new String[] { "Qinghai Lake", "Poyang Lake",
                "Dongting Lake", "Taihu Lake" });

        List<String> nation = new ArrayList<String>();
        nation.add("Han");
        nation.add("Meng");
        nation.add("Hui");
        nation.add("WeiWuEr");
        nation.add("Zang");
        country.setNation(nation);

        Province province = new Province();
        province.name = "Shanxi";
        province.population = 37751200;
        Province province2 = new Province();
        province2.name = "ZheJiang";
        province2.population = 55080000;
        List<Province> provinces = new ArrayList<Province>();
        provinces.add(province);
        provinces.add(province2);
        country.setProvinces(provinces);

        country.addTraffic("Train(KM)", 112000);
        country.addTraffic("HighWay(KM)", 4240000);
        // 爲了使JSON視覺上的可讀性,增長一行以下代碼,注意,在生產中不須要這樣,由於這樣會增大Json的內容
        mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
        // 配置mapper忽略空屬性
        mapper.setSerializationInclusion(Include.NON_EMPTY);
        // 默認狀況,Jackson使用Java屬性字段名稱做爲 Json的屬性名稱,也可使用Jackson annotations(註解)改變Json屬性名稱
        mapper.writeValue(new File("country.json"), country);
    }

    public static void main(String[] args) throws Exception {
        convert();
    }

}
程序運行後生成country.json,內容以下:
  1. {  
  2.   「country_id」 : 「China」,  
  3.   「birthDate」 : 「1949-10-01」,  
  4.   「nation」 : [ 「Han」, 「Meng」, 「Hui」, 「WeiWuEr」, 「Zang」 ],  
  5.   「lakes」 : [ 「Qinghai Lake」, 「Poyang Lake」, 「Dongting Lake」, 「Taihu Lake」 ],  
  6.   「provinces」 : [ {  
  7.     「name」 : 「Shanxi」,  
  8.     「population」 : 37751200  
  9.   }, {  
  10.     「name」 : 「ZheJiang」,  
  11.     「population」 : 55080000  
  12.   } ],  
  13.   「traffic」 : {  
  14.     「HighWay(KM)」 : 4240000,  
  15.     「Train(KM)」 : 112000  
  16.   }  
  17. }  
{
  "country_id" : "China",
  "birthDate" : "1949-10-01",
  "nation" : [ "Han", "Meng", "Hui", "WeiWuEr", "Zang" ],
  "lakes" : [ "Qinghai Lake", "Poyang Lake", "Dongting Lake", "Taihu Lake" ],
  "provinces" : [ {
    "name" : "Shanxi",
    "population" : 37751200
  }, {
    "name" : "ZheJiang",
    "population" : 55080000
  } ],
  "traffic" : {
    "HighWay(KM)" : 4240000,
    "Train(KM)" : 112000
  }
}

(2)Json字符串反序列化爲java對象:
  1. package com.jackson.json.databinding;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.text.SimpleDateFormat;  
  6. import java.util.Iterator;  
  7. import java.util.List;  
  8.   
  9. import com.fasterxml.jackson.core.JsonParseException;  
  10. import com.fasterxml.jackson.databind.DeserializationFeature;  
  11. import com.fasterxml.jackson.databind.JsonMappingException;  
  12. import com.fasterxml.jackson.databind.ObjectMapper;  
  13.   
  14. /** 
  15.  * 將Json字符串反序列化爲Java對象 
  16.  */  
  17. public class JsonDeserializeToJava {  
  18.       
  19.     public static void main(String[] args) throws Exception {  
  20.         //ObjectMapper類用序列化與反序列化映射器  
  21.         ObjectMapper mapper = new ObjectMapper();  
  22.         File json = new File(「country.json」);  
  23.         //當反序列化json時,未知屬性會引發的反序列化被打斷,這裏咱們禁用未知屬性打斷反序列化功能,  
  24.         //由於,例如json裏有10個屬性,而咱們的bean中只定義了2個屬性,其它8個屬性將被忽略  
  25.         mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);  
  26.           
  27.         //從json映射到java對象,獲得country對象後就能夠遍歷查找,下面遍歷部份內容,能說明問題就能夠了  
  28.         Country country = mapper.readValue(json, Country.class);  
  29.         System.out.println(」country_id:」+country.getCountry_id());  
  30.         //設置時間格式,便於閱讀  
  31.         SimpleDateFormat dateformat = new SimpleDateFormat(「yyyy-MM-dd」);  
  32.         String birthDate = dateformat.format(country.getBirthDate());  
  33.         System.out.println(」birthDate:」+birthDate);  
  34.           
  35.         List<Province> provinces = country.getProvinces();  
  36.         for (Province province : provinces) {  
  37.             System.out.println(」province:」+province.name + 「\n」 + 「population:」+province.population);  
  38.         }  
  39.     }  
  40. }  
package com.jackson.json.databinding;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Iterator;
import java.util.List;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * 將Json字符串反序列化爲Java對象
 */
public class JsonDeserializeToJava {

    public static void main(String[] args) throws Exception {
        //ObjectMapper類用序列化與反序列化映射器
        ObjectMapper mapper = new ObjectMapper();
        File json = new File("country.json");
        //當反序列化json時,未知屬性會引發的反序列化被打斷,這裏咱們禁用未知屬性打斷反序列化功能,
        //由於,例如json裏有10個屬性,而咱們的bean中只定義了2個屬性,其它8個屬性將被忽略
        mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        //從json映射到java對象,獲得country對象後就能夠遍歷查找,下面遍歷部份內容,能說明問題就能夠了
        Country country = mapper.readValue(json, Country.class);
        System.out.println("country_id:"+country.getCountry_id());
        //設置時間格式,便於閱讀
        SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
        String birthDate = dateformat.format(country.getBirthDate());
        System.out.println("birthDate:"+birthDate);

        List<Province> provinces = country.getProvinces();
        for (Province province : provinces) {
            System.out.println("province:"+province.name + "\n" + "population:"+province.population);
        }
    }
}
程序運行結果:
  1. country_id:China  
  2. birthDate:1949-10-01  
  3. province:Shanxi  
  4. population:37751200  
  5. province:ZheJiang  
  6. population:55080000  
country_id:China
birthDate:1949-10-01
province:Shanxi
population:37751200
province:ZheJiang
population:55080000

2.Tree Model處理Json

(1)tree model生成json:web

  1. package com.jackson.json.treemodel;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileWriter;  
  5.   
  6. import com.fasterxml.jackson.core.JsonFactory;  
  7. import com.fasterxml.jackson.core.JsonGenerator;  
  8. import com.fasterxml.jackson.databind.ObjectMapper;  
  9. import com.fasterxml.jackson.databind.SerializationFeature;  
  10. import com.fasterxml.jackson.databind.node.ArrayNode;  
  11. import com.fasterxml.jackson.databind.node.JsonNodeFactory;  
  12. import com.fasterxml.jackson.databind.node.ObjectNode;  
  13.   
  14. public class SerializationExampleTreeModel {  
  15.       
  16.     public static void main(String[] args) throws Exception {  
  17.         //建立一個節點工廠,爲咱們提供全部節點  
  18.         JsonNodeFactory factory = new JsonNodeFactory(false);  
  19.         //建立一個json factory來寫tree modle爲json  
  20.         JsonFactory jsonFactory = new JsonFactory();  
  21.         //建立一個json生成器  
  22.         JsonGenerator generator = jsonFactory.createGenerator(new FileWriter(new File(「country2.json」)));  
  23.         //注意,默認狀況下對象映射器不會指定根節點,下面設根節點爲country  
  24.         ObjectMapper mapper = new ObjectMapper();  
  25.         ObjectNode country = factory.objectNode();  
  26.           
  27.         country.put(」country_id」「China」);  
  28.         country.put(」birthDate」「1949-10-01」);  
  29.           
  30.         //在Java中,List和Array轉化爲json後對應的格式符號都是」obj:[]」  
  31.         ArrayNode nation = factory.arrayNode();  
  32.         nation.add(」Han」).add(「Meng」).add(「Hui」).add(「WeiWuEr」).add(「Zang」);  
  33.         country.set(」nation」, nation);  
  34.           
  35.         ArrayNode lakes = factory.arrayNode();  
  36.         lakes.add(」QingHai Lake」).add(「Poyang Lake」).add(「Dongting Lake」).add(「Taihu Lake」);  
  37.         country.set(」lakes」, lakes);  
  38.           
  39.         ArrayNode provinces = factory.arrayNode();  
  40.         ObjectNode province = factory.objectNode();  
  41.         ObjectNode province2 = factory.objectNode();  
  42.         province.put(」name」,「Shanxi」);  
  43.         province.put(」population」37751200);  
  44.         province2.put(」name」,「ZheJiang」);  
  45.         province2.put(」population」55080000);  
  46.         provinces.add(province).add(province2);  
  47.         country.set(」provinces」, provinces);  
  48.           
  49.         ObjectNode traffic = factory.objectNode();  
  50.         traffic.put(」HighWay(KM)」4240000);  
  51.         traffic.put(」Train(KM)」112000);  
  52.         country.set(」traffic」, traffic);  
  53.           
  54.         mapper.configure(SerializationFeature.INDENT_OUTPUT, true);  
  55.         mapper.writeTree(generator, country);  
  56.     }  
  57.   
  58. }  
package com.jackson.json.treemodel;

import java.io.File;
import java.io.FileWriter;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class SerializationExampleTreeModel {

    public static void main(String[] args) throws Exception {
        //建立一個節點工廠,爲咱們提供全部節點
        JsonNodeFactory factory = new JsonNodeFactory(false);
        //建立一個json factory來寫tree modle爲json
        JsonFactory jsonFactory = new JsonFactory();
        //建立一個json生成器
        JsonGenerator generator = jsonFactory.createGenerator(new FileWriter(new File("country2.json")));
        //注意,默認狀況下對象映射器不會指定根節點,下面設根節點爲country
        ObjectMapper mapper = new ObjectMapper();
        ObjectNode country = factory.objectNode();

        country.put("country_id", "China");
        country.put("birthDate", "1949-10-01");

        //在Java中,List和Array轉化爲json後對應的格式符號都是"obj:[]"
        ArrayNode nation = factory.arrayNode();
        nation.add("Han").add("Meng").add("Hui").add("WeiWuEr").add("Zang");
        country.set("nation", nation);

        ArrayNode lakes = factory.arrayNode();
        lakes.add("QingHai Lake").add("Poyang Lake").add("Dongting Lake").add("Taihu Lake");
        country.set("lakes", lakes);

        ArrayNode provinces = factory.arrayNode();
        ObjectNode province = factory.objectNode();
        ObjectNode province2 = factory.objectNode();
        province.put("name","Shanxi");
        province.put("population", 37751200);
        province2.put("name","ZheJiang");
        province2.put("population", 55080000);
        provinces.add(province).add(province2);
        country.set("provinces", provinces);

        ObjectNode traffic = factory.objectNode();
        traffic.put("HighWay(KM)", 4240000);
        traffic.put("Train(KM)", 112000);
        country.set("traffic", traffic);

        mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
        mapper.writeTree(generator, country);
    }

}

程序運行生成country2.json,內容以下:json

  1. {「country_id」:」China」,」birthDate」:」1949-10-01」,」nation」:[「Han」,」Meng」,」Hui」,」WeiWuEr」,」Zang」],」lakes」:[「QingHai Lake」,」Poyang Lake」,」Dongting Lake」,」Taihu Lake」],」provinces」:[{「name」:」Shanxi」,」population」:37751200},{「name」:」ZheJiang」,」population」:55080000}],」traffic」:{「HighWay(KM)」:4240000,」Train(KM)」:112000}}  
  
  
  
  
    {"country_id":"China","birthDate":"1949-10-01","nation":["Han","Meng","Hui","WeiWuEr","Zang"],"lakes":["QingHai Lake","Poyang Lake","Dongting Lake","Taihu Lake"],"provinces":[{"name":"Shanxi","population":37751200},{"name":"ZheJiang","population":55080000}],"traffic":{"HighWay(KM)":4240000,"Train(KM)":112000}}

    (2) json字符串反序列化爲tree modemarkdown

    DeserializationExampleTreeModel1.java,請注意觀察程序中不一樣的JsonNode的類型變化app

    1. package com.jackson.json.treemodel;  
    2.   
    3. import java.io.File;  
    4. import java.util.Iterator;  
    5.   
    6. import com.fasterxml.jackson.databind.JsonNode;  
    7. import com.fasterxml.jackson.databind.ObjectMapper;  
    8.   
    9. public class DeserializationExampleTreeModel1 {  
    10.   
    11.     public static void main(String[] args) throws Exception {  
    12.         ObjectMapper mapper = new ObjectMapper();  
    13.         // Jackson提供一個樹節點被稱爲」JsonNode」,ObjectMapper提供方法來讀json做爲樹的JsonNode根節點  
    14.         JsonNode node = mapper.readTree(new File(「country2.json」));  
    15.         // 看看根節點的類型  
    16.         System.out.println(」node JsonNodeType:」+node.getNodeType());  
    17.         // 是否是一個容器  
    18.         System.out.println(」node is container Node ? 」+node.isContainerNode());  
    19.         // 獲得全部node節點的子節點名稱  
    20.         System.out.println(」———獲得全部node節點的子節點名稱————————-「);  
    21.         Iterator<String> fieldNames = node.fieldNames();  
    22.         while (fieldNames.hasNext()) {  
    23.             String fieldName = fieldNames.next();  
    24.             System.out.print(fieldName+」 」);  
    25.         }  
    26.         System.out.println(」\n—————————————————–」);  
    27.         // as.Text的做用是有值返回值,無值返回空字符串  
    28.         JsonNode country_id = node.get(」country_id」);  
    29.         System.out.println(」country_id:」+country_id.asText() + 「 JsonNodeType:」+country_id.getNodeType());  
    30.           
    31.         JsonNode birthDate = node.get(」birthDate」);  
    32.         System.out.println(」birthDate:」+birthDate.asText()+「 JsonNodeType:」+birthDate.getNodeType());  
    33.           
    34.         JsonNode nation = node.get(」nation」);  
    35.         System.out.println(」nation:」+ nation+ 「 JsonNodeType:」+nation.getNodeType());  
    36.           
    37.         JsonNode lakes = node.get(」lakes」);  
    38.         System.out.println(」lakes:」+lakes+「 JsonNodeType:」+lakes.getNodeType());  
    39.   
    40.         JsonNode provinces = node.get(」provinces」);  
    41.         System.out.println(」provinces JsonNodeType:」+provinces.getNodeType());  
    42.   
    43.         boolean flag = true;  
    44.         for (JsonNode provinceElements : provinces) {  
    45.             //爲了不provinceElements屢次打印,用flag控制打印,能體現provinceElements的JsonNodeType就能夠了  
    46.             if(flag){  
    47.                 System.out.println(」provinceElements JsonNodeType:」+provinceElements.getNodeType());  
    48.                 System.out.println(」provinceElements is container node? 」+provinceElements.isContainerNode());  
    49.                 flag = false;  
    50.             }  
    51.             Iterator<String> provinceElementFields = provinceElements.fieldNames();  
    52.             while (provinceElementFields.hasNext()) {  
    53.                 String fieldName = (String) provinceElementFields.next();  
    54.                 String province;  
    55.                 if (「population」.equals(fieldName)) {  
    56.                     province = fieldName + 」:」 + provinceElements.get(fieldName).asInt();  
    57.                 }else{  
    58.                     province = fieldName + 」:」 + provinceElements.get(fieldName).asText();  
    59.                 }  
    60.                 System.out.println(province);  
    61.             }  
    62.         }  
    63.     }  
    64. }  
    package com.jackson.json.treemodel;
    
    import java.io.File;
    import java.util.Iterator;
    
    import com.fasterxml.jackson.databind.JsonNode;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    public class DeserializationExampleTreeModel1 {
    
        public static void main(String[] args) throws Exception {
            ObjectMapper mapper = new ObjectMapper();
            // Jackson提供一個樹節點被稱爲"JsonNode",ObjectMapper提供方法來讀json做爲樹的JsonNode根節點
            JsonNode node = mapper.readTree(new File("country2.json"));
            // 看看根節點的類型
            System.out.println("node JsonNodeType:"+node.getNodeType());
            // 是否是一個容器
            System.out.println("node is container Node ? "+node.isContainerNode());
            // 獲得全部node節點的子節點名稱
            System.out.println("---------獲得全部node節點的子節點名稱-------------------------");
            Iterator<String> fieldNames = node.fieldNames();
            while (fieldNames.hasNext()) {
                String fieldName = fieldNames.next();
                System.out.print(fieldName+" ");
            }
            System.out.println("\n-----------------------------------------------------");
            // as.Text的做用是有值返回值,無值返回空字符串
            JsonNode country_id = node.get("country_id");
            System.out.println("country_id:"+country_id.asText() + " JsonNodeType:"+country_id.getNodeType());
    
            JsonNode birthDate = node.get("birthDate");
            System.out.println("birthDate:"+birthDate.asText()+" JsonNodeType:"+birthDate.getNodeType());
    
            JsonNode nation = node.get("nation");
            System.out.println("nation:"+ nation+ " JsonNodeType:"+nation.getNodeType());
    
            JsonNode lakes = node.get("lakes");
            System.out.println("lakes:"+lakes+" JsonNodeType:"+lakes.getNodeType());
    
            JsonNode provinces = node.get("provinces");
            System.out.println("provinces JsonNodeType:"+provinces.getNodeType());
    
            boolean flag = true;
            for (JsonNode provinceElements : provinces) {
                //爲了不provinceElements屢次打印,用flag控制打印,能體現provinceElements的JsonNodeType就能夠了
                if(flag){
                    System.out.println("provinceElements JsonNodeType:"+provinceElements.getNodeType());
                    System.out.println("provinceElements is container node? "+provinceElements.isContainerNode());
                    flag = false;
                }
                Iterator<String> provinceElementFields = provinceElements.fieldNames();
                while (provinceElementFields.hasNext()) {
                    String fieldName = (String) provinceElementFields.next();
                    String province;
                    if ("population".equals(fieldName)) {
                        province = fieldName + ":" + provinceElements.get(fieldName).asInt();
                    }else{
                        province = fieldName + ":" + provinceElements.get(fieldName).asText();
                    }
                    System.out.println(province);
                }
            }
        }
    }

    程序運行後打印結果以下:框架

    1. node JsonNodeType:OBJECT  
    2. node is container Node ? true  
    3. ———獲得全部node節點的子節點名稱————————-  
    4. country_id birthDate nation lakes provinces traffic   
    5. —————————————————–  
    6. country_id:China JsonNodeType:STRING  
    7. birthDate:1949-10-01 JsonNodeType:STRING  
    8. nation:[「Han」,」Meng」,」Hui」,」WeiWuEr」,」Zang」] JsonNodeType:ARRAY  
    9. lakes:[「QingHai Lake」,」Poyang Lake」,」Dongting Lake」,」Taihu Lake」] JsonNodeType:ARRAY  
    10. provinces JsonNodeType:ARRAY  
    11. provinceElements JsonNodeType:OBJECT  
    12. provinceElements is container node? true  
    13. name:Shanxi  
    14. population:37751200  
    15. name:ZheJiang  
    16. population:55080000  
    node JsonNodeType:OBJECT
    node is container Node ? true
    ---------獲得全部node節點的子節點名稱-------------------------
    country_id birthDate nation lakes provinces traffic ----------------------------------------------------- country_id:China JsonNodeType:STRING birthDate:1949-10-01 JsonNodeType:STRING nation:["Han","Meng","Hui","WeiWuEr","Zang"] JsonNodeType:ARRAY lakes:["QingHai Lake","Poyang Lake","Dongting Lake","Taihu Lake"] JsonNodeType:ARRAY provinces JsonNodeType:ARRAY provinceElements JsonNodeType:OBJECT provinceElements is container node? true name:Shanxi population:37751200 name:ZheJiang population:55080000


    在來看一下DeserializationExampleTreeModel2.java,本例中使用JsonNode.path的方法,path方法相似於DeserializationExampleTreeModel1.java中使用的get方法,

    但當node不存在時,get方法返回null,而path返回MISSING類型的JsonNode

    1. package com.jackson.json.treemodel;  
    2.   
    3. import java.io.File;  
    4. import java.io.IOException;  
    5. import java.util.Iterator;  
    6.   
    7. import com.fasterxml.jackson.core.JsonProcessingException;  
    8. import com.fasterxml.jackson.databind.JsonNode;  
    9. import com.fasterxml.jackson.databind.ObjectMapper;  
    10.   
    11. public class DeserializationExampleTreeModle2 {  
    12.       
    13.     public static void main(String[] args) throws JsonProcessingException, IOException{  
    14.         ObjectMapper mapper = new ObjectMapper();  
    15.         JsonNode node = mapper.readTree(new File(「country2.json」));  
    16.         //path方法獲取JsonNode時,當對象不存在時,返回MISSING類型的JsonNode  
    17.         JsonNode missingNode = node.path(」test」);  
    18.         if(missingNode.isMissingNode()){  
    19.             System.out.println(」JsonNodeType : 」 + missingNode.getNodeType());  
    20.         }  
    21.   
    22.         System.out.println(」country_id:」+node.path(「country_id」).asText());  
    23.           
    24.         JsonNode provinces = node.path(」provinces」);  
    25.         for (JsonNode provinceElements : provinces) {  
    26.             Iterator<String> provincesFields = provinceElements.fieldNames();  
    27.             while (provincesFields.hasNext()) {  
    28.                 String fieldName = (String) provincesFields.next();  
    29.                 String province;  
    30.                 if(「name」.equals(fieldName)){  
    31.                     province = fieldName +」:」+ provinceElements.path(fieldName).asText();  
    32.                 }else{  
    33.                     province = fieldName +」:」+ provinceElements.path(fieldName).asInt();  
    34.                 }  
    35.                 System.out.println(province);  
    36.             }  
    37.         }  
    38.     }  
    39.   
    40. }  
    package com.jackson.json.treemodel;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.Iterator;
    
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.JsonNode;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    public class DeserializationExampleTreeModle2 {
    
        public static void main(String[] args) throws JsonProcessingException, IOException{
            ObjectMapper mapper = new ObjectMapper();
            JsonNode node = mapper.readTree(new File("country2.json"));
            //path方法獲取JsonNode時,當對象不存在時,返回MISSING類型的JsonNode
            JsonNode missingNode = node.path("test");
            if(missingNode.isMissingNode()){
                System.out.println("JsonNodeType : " + missingNode.getNodeType());
            }
    
            System.out.println("country_id:"+node.path("country_id").asText());
    
            JsonNode provinces = node.path("provinces");
            for (JsonNode provinceElements : provinces) {
                Iterator<String> provincesFields = provinceElements.fieldNames();
                while (provincesFields.hasNext()) {
                    String fieldName = (String) provincesFields.next();
                    String province;
                    if("name".equals(fieldName)){
                        province = fieldName +":"+ provinceElements.path(fieldName).asText();
                    }else{
                        province = fieldName +":"+ provinceElements.path(fieldName).asInt();
                    }
                    System.out.println(province);
                }
            }
        }
    
    }
    程序運行打印結果:
    1. JsonNodeType : MISSING  
    2. country_id:China  
    3. name:Shanxi  
    4. population:37751200  
    5. name:ZheJiang  
    6. population:55080000  
    JsonNodeType : MISSING
    country_id:China
    name:Shanxi
    population:37751200
    name:ZheJiang
    population:55080000

    3.Stream處理Json

    (1)stream生成json

    1. package com.jackson.json.streaming;  
    2.   
    3. import java.io.File;  
    4. import java.io.FileWriter;  
    5. import java.io.Exception;  
    6.   
    7. import com.fasterxml.jackson.core.JsonFactory;  
    8. import com.fasterxml.jackson.core.JsonGenerator;  
    9.   
    10. public class StreamGeneratorJson {  
    11.       
    12.     public static void main(String[] args) throws Exception {  
    13.         JsonFactory factory = new JsonFactory();  
    14.         //從JsonFactory建立一個JsonGenerator生成器的實例  
    15.         JsonGenerator generator = factory.createGenerator(new FileWriter(new File(「country3.json」)));  
    16.           
    17.         generator.writeStartObject();  
    18.         generator.writeFieldName(」country_id」);  
    19.         generator.writeString(」China」);  
    20.         generator.writeFieldName(」provinces」);  
    21.         generator.writeStartArray();  
    22.         generator.writeStartObject();  
    23.         generator.writeStringField(」name」「Shanxi」);  
    24.         generator.writeNumberField(」population」33750000);  
    25.         generator.writeEndObject();  
    26.         generator.writeEndArray();  
    27.         generator.writeEndObject();  
    28.           
    29.         generator.close();  
    30.     }  
    31.   
    32. }  
    package com.jackson.json.streaming;
    
    import java.io.File;
    import java.io.FileWriter;
    import java.io.Exception;
    
    import com.fasterxml.jackson.core.JsonFactory;
    import com.fasterxml.jackson.core.JsonGenerator;
    
    public class StreamGeneratorJson {
    
        public static void main(String[] args) throws Exception {
            JsonFactory factory = new JsonFactory();
            //從JsonFactory建立一個JsonGenerator生成器的實例
            JsonGenerator generator = factory.createGenerator(new FileWriter(new File("country3.json")));
    
            generator.writeStartObject();
            generator.writeFieldName("country_id");
            generator.writeString("China");
            generator.writeFieldName("provinces");
            generator.writeStartArray();
            generator.writeStartObject();
            generator.writeStringField("name", "Shanxi");
            generator.writeNumberField("population", 33750000);
            generator.writeEndObject();
            generator.writeEndArray();
            generator.writeEndObject();
    
            generator.close();
        }
    
    }
    程序運行後生成country3.json文件內容:
    1. {「country_id」:」China」,」provinces」:[{「name」:」Shanxi」,」population」:33750000}]}  
       
       
       
       
      {"country_id":"China","provinces":[{"name":"Shanxi","population":33750000}]}

      (2)stream解析json:
      如今adgcountry3.json,咱們用Streaming API的方式來解析上面的Json,並查找json中population的值。
      1. package com.jackson.json.streaming;  
      2.   
      3. import java.io.File;  
      4. import java.io.IOException;  
      5.   
      6. import com.fasterxml.jackson.core.JsonFactory;  
      7. import com.fasterxml.jackson.core.JsonParseException;  
      8. import com.fasterxml.jackson.core.JsonParser;  
      9. import com.fasterxml.jackson.core.JsonToken;  
      10.   
      11. /*Jackson API提供了token對每一個Json對象,例如,Json開始符號「{」是token指向的第一個解析的對象, 
      12.  key:value鍵值對是另外一個單獨的對象。這個API很強大,但也須要編寫大量代碼。不推薦使用,平時更多的是使用DataBinding和TreeModel來處理json 
      13.  */  
      14. public class StreamParserJson {  
      15.     public static void main(String[] args) throws JsonParseException,  
      16.             IOException {  
      17.         JsonFactory factory = new JsonFactory();  
      18.         // 從JsonFactory建立JsonParser解析器的實例  
      19.         JsonParser parser = factory.createParser(new File(「country3.json」));  
      20.   
      21.         while (!parser.isClosed()) {  
      22.             // 獲得一個token,第一次遍歷時,token指向json文件中第一個符號」{「  
      23.             JsonToken token = parser.nextToken();  
      24.             if (token == null) {  
      25.                 break;  
      26.             }  
      27.             // 咱們只查找 country3.json中的」population」字段的值,能體現解析的流程就能夠了  
      28.             // 當key是provinces時,咱們進入provinces,查找population  
      29.             if (JsonToken.FIELD_NAME.equals(token)  
      30.                     && 」provinces」.equals(parser.getCurrentName())) {  
      31.                 token = parser.nextToken();  
      32.                 if (!JsonToken.START_ARRAY.equals(token)) {  
      33.                     break;  
      34.                 }  
      35.                 // 此時,token指向的應該是」{「  
      36.                 token = parser.nextToken();  
      37.                 if (!JsonToken.START_OBJECT.equals(token)) {  
      38.                     break;  
      39.                 }  
      40.                 while (true) {  
      41.                     token = parser.nextToken();  
      42.                     if (token == null) {  
      43.                         break;  
      44.                     }  
      45.                     if (JsonToken.FIELD_NAME.equals(token)  
      46.                             && 」population」.equals(parser.getCurrentName())) {  
      47.                         token = parser.nextToken();  
      48.                         System.out.println(parser.getCurrentName() + 」 : 」  
      49.                                 + parser.getIntValue());  
      50.                     }  
      51.                 }  
      52.             }  
      53.         }  
      54.     }  
      55.   
      56. }  
      package com.jackson.json.streaming;
      
      import java.io.File;
      import java.io.IOException;
      
      import com.fasterxml.jackson.core.JsonFactory;
      import com.fasterxml.jackson.core.JsonParseException;
      import com.fasterxml.jackson.core.JsonParser;
      import com.fasterxml.jackson.core.JsonToken;
      
      /*Jackson API提供了token對每一個Json對象,例如,Json開始符號「{」是token指向的第一個解析的對象,
       key:value鍵值對是另外一個單獨的對象。這個API很強大,但也須要編寫大量代碼。不推薦使用,平時更多的是使用DataBinding和TreeModel來處理json
       */
      public class StreamParserJson {
          public static void main(String[] args) throws JsonParseException,
                  IOException {
              JsonFactory factory = new JsonFactory();
              // 從JsonFactory建立JsonParser解析器的實例
              JsonParser parser = factory.createParser(new File("country3.json"));
      
              while (!parser.isClosed()) {
                  // 獲得一個token,第一次遍歷時,token指向json文件中第一個符號"{"
                  JsonToken token = parser.nextToken();
                  if (token == null) {
                      break;
                  }
                  // 咱們只查找 country3.json中的"population"字段的值,能體現解析的流程就能夠了
                  // 當key是provinces時,咱們進入provinces,查找population
                  if (JsonToken.FIELD_NAME.equals(token)
                          && "provinces".equals(parser.getCurrentName())) {
                      token = parser.nextToken();
                      if (!JsonToken.START_ARRAY.equals(token)) {
                          break;
                      }
                      // 此時,token指向的應該是"{"
                      token = parser.nextToken();
                      if (!JsonToken.START_OBJECT.equals(token)) {
                          break;
                      }
                      while (true) {
                          token = parser.nextToken();
                          if (token == null) {
                              break;
                          }
                          if (JsonToken.FIELD_NAME.equals(token)
                                  && "population".equals(parser.getCurrentName())) {
                              token = parser.nextToken();
                              System.out.println(parser.getCurrentName() + " : "
                                      + parser.getIntValue());
                          }
                      }
                  }
              }
          }
      
      }
      程序運行後,在控制檯打印結果以下:
      1. population : 33750000  
      population : 33750000

      總結

      上面的例子中,分別用3種方式處理Json,個人體會大體以下:

      Stream API方式是開銷最低、效率最高,但編寫代碼複雜度也最高,在生成Json時,須要逐步編寫符號和字段拼接json,在解析Json時,須要根據token指向也查找json值,生成和解析json都不是很方便,代碼可讀性也很低。
      Databinding處理Json是最經常使用的json處理方式,生成json時,建立相關的java對象,並根據json內容結構把java對象組裝起來,最後調用writeValue方法便可生成json,
      解析時,就更簡單了,直接把json映射到相關的java對象,而後就能夠遍歷java對象來獲取值了。
      TreeModel處理Json,是以樹型結構來生成和解析json,生成json時,根據json內容結構,咱們建立不一樣類型的節點對象,組裝這些節點生成json。解析json時,它不須要綁定json到java bean,根據json結構,使用path或get方法輕鬆查找內容。

      學習參考: http://www.cnblogs.com/lee0oo0/articles/2652528.html
      相關文章
      相關標籤/搜索