Jackson 学习
概述
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開頭
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/JacksonDownload
準備工作
本文所有程序都基于JDK1.7,依賴jackon的三個核心類庫:
jackson-core-2.5.3.jar
jackson-annotations-2.5.3.jar
jackson-databind-2.5.3.jar
Jackson處理Json
Jackson提供了三種可選的Json處理方法:流式API(Streaming API) 、樹模型(Tree Model)、數據綁定(Data Binding)。從使用角度來看,比較一下這三種處理Json的方式的特性:
Streaming API:是效率最高的處理方式(開銷低、讀寫速度快,但程序編寫復雜度高)
Tree Model:是最靈活的處理方式
Data Binding:是最常用的處理方式
下面我們通過例子程序分別使用DataBinding,TreeModel,Streaming的方式來創建和解析Json字符串
1.DataBinding處理Json
Jackson支持Java對象與Json之間的相互轉化。java對象序列化為json字符串,json字符串也可以反序列化為相同的java對象。
(1)java對象轉化成json:
Province.java
[java] view plain copy
在CODE上查看代碼片派生到我的代碼片
??? package com.jackson.json.databinding; ?
???? ?
??? public class Province { ?
??????? public String name; ?
??????? public int population; ?
??????? public String[] city;??? ?
??? } ?
Country.java
[java] view plain copy
在CODE上查看代碼片派生到我的代碼片
??? 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
[java] view plain copy
在CODE上查看代碼片派生到我的代碼片
??? 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,內容如下:
[html] view plain copy
在CODE上查看代碼片派生到我的代碼片
??? { ?
????? "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對象:
[java] view plain copy
在CODE上查看代碼片派生到我的代碼片
??? 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); ?
??????????? } ?
??????? } ?
??? } ?
程序運行結果:
[html] view plain copy
在CODE上查看代碼片派生到我的代碼片
??? country_id:China ?
??? birthDate:1949-10-01 ?
??? province:Shanxi ?
??? population:37751200 ?
??? province:ZheJiang ?
??? population:55080000 ?
2.Tree Model處理Json
(1)tree model生成json:
[java] view plain copy
在CODE上查看代碼片派生到我的代碼片
??? 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,內容如下:
[html] view plain copy
在CODE上查看代碼片派生到我的代碼片
??? {"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 mode
DeserializationExampleTreeModel1.java,請注意觀察程序中不同的JsonNode的類型變化
[java] view plain copy
在CODE上查看代碼片派生到我的代碼片
??? 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); ?
??????????????? } ?
??????????? } ?
??????? } ?
??? } ?
程序運行后打印結果如下:
[html] view plain copy
在CODE上查看代碼片派生到我的代碼片
??? 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
[java] view plain copy
在CODE上查看代碼片派生到我的代碼片
??? 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); ?
??????????????? } ?
??????????? } ?
??????? } ?
???? ?
??? } ?
程序運行打印結果:
[html] view plain copy
在CODE上查看代碼片派生到我的代碼片
??? JsonNodeType : MISSING ?
??? country_id:China ?
??? name:Shanxi ?
??? population:37751200 ?
??? name:ZheJiang ?
??? population:55080000 ?
3.Stream處理Json
(1)stream生成json
[java] view plain copy
在CODE上查看代碼片派生到我的代碼片
??? 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文件內容:
[html] view plain copy
在CODE上查看代碼片派生到我的代碼片
??? {"country_id":"China","provinces":[{"name":"Shanxi","population":33750000}]} ?
(2)stream解析json:
現在adgcountry3.json,我們用Streaming API的方式來解析上面的Json,并查找json中population的值。
[java] view plain copy
在CODE上查看代碼片派生到我的代碼片
??? 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()); ?
??????????????????????? } ?
??????????????????? } ?
??????????????? } ?
??????????? } ?
??????? } ?
???? ?
??? } ?
程序運行后,在控制臺打印結果如下:
[html] view plain copy
在CODE上查看代碼片派生到我的代碼片
??? 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
轉載于:https://blog.51cto.com/10030874/1894453
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的Jackson 学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你可能不需要 Vuex
- 下一篇: SpringMVC图片上传与显示