一,Jackson使用示例
第1步:創建ObjectMapper對象。
創建ObjectMapper對象。它是一個可重復使用的對象。
ObjectMapper mapper = new ObjectMapper();
第2步:反序列化JSON到對象。
從JSON對象使用readValue()方法來獲取。通過JSON字符串和對象類型作為參數JSON字符串/來源。
//Object to JSON Conversion Student student = mapper.readValue(jsonString, Student.class);
第3步:序列化對象到JSON。
使用writeValueAsString()方法來獲取對象的JSON字符串表示。
//Object to JSON Conversion jsonString = mapper.writeValueAsString(student);
在這個例子中,我們創建一個Student類。將創建一個JSON字符串學生的詳細信息,並將其反序列化到學生的對象,然后將其序列化到JSON字符串。
public static void main(String args[]) throws JsonParseException, JsonMappingException, IOException { // 第1步:創建ObjectMapper對象。 // 創建ObjectMapper對象。它是一個可重復使用的對象。 ObjectMapper mapper = new ObjectMapper(); String jsonString = "{\"name\":\"Mahesh\", \"age\":21}"; // 第2步:反序列化JSON到對象。 // 從JSON對象使用readValue()方法來獲取。通過JSON字符串和對象類型作為參數JSON字符串/來源。 //map json to student Student student = mapper.readValue(jsonString, Student.class); System.out.println(student); // 第3步:序列化對象到JSON。 // 使用writeValueAsString()方法來獲取對象的JSON字符串表示。 jsonString = mapper.writeValueAsString(student); System.out.println(jsonString); }
public class Student { private String name; private int age; public Student() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String toString() { return "Student [ name: " + name + ", age: " + age + " ]"; } }
二,Jackson數據綁定
數據綁定API用於JSON轉換和使用屬性訪問或使用注解POJO(普通Java對象)。以下是它的兩個類型。
-
簡單數據綁定 - 轉換JSON,從Java Maps, Lists, Strings, Numbers, Booleans 和 null 對象。
-
完整數據綁定 - 轉換JSON到任何JAVA類型。
ObjectMapper讀/寫JSON兩種類型的數據綁定。數據綁定是最方便的方式是類似XML的JAXB解析器。
簡單的數據綁定
簡單的數據綁定是指JSON映射到Java核心數據類型。下表列出了JSON類型和Java類型之間的關系。
| Sr. No. | JSON 類型 | Java 類型 |
|---|---|---|
| 1 | object | LinkedHashMap<String,Object> |
| 2 | array | ArrayList<Object> |
| 3 | string | String |
| 4 | complete number | Integer, Long or BigInteger |
| 5 | fractional number | Double / BigDecimal |
| 6 | true | false | Boolean |
| 7 | null | null |
public static void main(String args[]) throws JsonGenerationException, JsonMappingException, IOException { ObjectMapper mapper = new ObjectMapper(); Map<String, Object> studentDataMap = new HashMap<String, Object>(); int[] marks = { 1, 2, 3 }; Student student = new Student(); student.setAge(10); student.setName("Mahesh"); // JAVA Object studentDataMap.put("student", student); // JAVA String studentDataMap.put("name", "Mahesh Kumar"); // JAVA Boolean studentDataMap.put("verified", Boolean.FALSE); // Array studentDataMap.put("marks", marks); mapper.writeValue(new File("student3.json"), studentDataMap); //result student.json //{ // "student":{"name":"Mahesh","age":10}, // "marks":[1,2,3], // "verified":false, // "name":"Mahesh Kumar" //} studentDataMap = mapper.readValue(new File("student3.json"), Map.class); System.out.println(studentDataMap.get("student")); System.out.println(studentDataMap.get("name")); System.out.println(studentDataMap.get("verified")); System.out.println(studentDataMap.get("marks")); }
完整數據綁定
如最上面的例子的第2步
// 第2步:反序列化JSON到對象。 // 從JSON對象使用readValue()方法來獲取。通過JSON字符串和對象類型作為參數JSON字符串/來源。 //map json to student Student student = mapper.readValue(jsonString, Student.class); System.out.println(student);
三,Jackson樹模型
樹模型准備JSON文件的內存樹表示。 ObjectMapper構建JsonNode節點樹。這是最靈活的方法。它類似於DOM解析器的XML。
從JSON創建樹
public static void main(String args[]) throws JsonProcessingException, IOException { ObjectMapper mapper = new ObjectMapper(); String jsonString = "{\"name\":\"Mahesh Kumar\", \"age\":21,\"verified\":false,\"marks\": [100,90,85]}"; // 從JSON創建樹 JsonNode rootNode = mapper.readTree(jsonString); // 使用相對路徑來根節點在遍歷樹,並處理該數據得到的每個節點。考慮下面的代碼片段遍歷提供的根節點的樹。 JsonNode nameNode = rootNode.path("name"); System.out.println("Name: " + nameNode.textValue()); JsonNode ageNode = rootNode.path("age"); System.out.println("Age: " + ageNode.intValue()); JsonNode verifiedNode = rootNode.path("verified"); System.out.println("Verified: " + (verifiedNode.booleanValue() ? "Yes" : "No")); JsonNode marksNode = rootNode.path("marks"); Iterator<JsonNode> iterator = marksNode.elements(); System.out.print("Marks: [ "); while (iterator.hasNext()) { JsonNode marks = iterator.next(); System.out.print(marks.intValue() + " "); } System.out.println("]"); }
樹到Java對象轉換
public static void main(String args[]) throws JsonGenerationException, JsonMappingException, IOException { ObjectMapper mapper = new ObjectMapper(); String jsonString = "{\"name\":\"Mahesh\", \"age\":21}"; // 從JSON創建樹 JsonNode rootNode = mapper.readTree(jsonString); Student student = mapper.treeToValue(rootNode, Student.class); System.out.println(student); }
四,Jackson流式API
流式API讀取和寫入JSON內容離散事件。 JsonParser讀取數據,而JsonGenerator寫入數據。它是三者中最有效的方法,是最低開銷和最快的讀/寫操作。它類似於XML的Stax解析器。
-
JsonGenerator - 寫入JSON字符串。
-
JsonParser - 解析JSON字符串。
使用JsonGenerator寫入JSON
使用JsonGenerator是非常簡單的。首先使用JsonFactory.createJsonGenerator()方法創建一個JsonGenerator,並用write***()方法來寫每一個JSON值。
JsonFactory jasonFactory = new JsonFactory(); JsonGenerator jsonGenerator = jasonFactory.createJsonGenerator(new File("student.json"), JsonEncoding.UTF8); jsonGenerator.writeStartObject(); // "name" : "Mahesh Kumar" jsonGenerator.writeStringField("name", "Mahesh Kumar");
使用JsonParser 讀取JSON
使用JsonParser是非常簡單的。首先使用JsonFactory.createJsonParser()方法創建JsonParser,並使用它的nextToken()方法來讀取每個JSON字符串作為標記。檢查每個令牌和相應的過程。
JsonFactory jasonFactory = new JsonFactory(); JJsonParser jsonParser = jasonFactory.createJsonParser(new File("student.json")); while (jsonParser.nextToken() != JsonToken.END_OBJECT) { //get the current token String fieldname = jsonParser.getCurrentName(); if ("name".equals(fieldname)) { //move to next token jsonParser.nextToken(); System.out.println(jsonParser.getText()); } }
附錄:
反序列化JSON到list。
ObjectMapper mapper = new ObjectMapper(); List<Budget> budgets = mapper.readValue(jsonString, new TypeReference<List<Budget>>() { });
實例:
package com.xc.json.JackSon; import java.util.Iterator; import java.util.List; import java.util.Map; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; public class JackSon { public static void main(String[] args) throws Exception { String json = "{\"username\":\"zhangsan\",\"性別\":\"男\",\"company\":{\"companyName\":\"中華\",\"address\":\"北京\"},\"cars\":[\"蔚藍\",\"特斯拉\"],\"logList\":[{\"id\":123,\"name\":\"abc\"},{\"id\":234,\"name\":\"efff\"}]}"; System.out.println(json); ObjectMapper mapper = new ObjectMapper(); JsonNode rootNode = mapper.readTree(json); // String的處理 JsonNode usernameNode = rootNode.path("username"); System.out.println("==username=="); String textValue = usernameNode.textValue(); System.out.println("textValue:" + textValue); String asText = usernameNode.asText(); System.out.println("asText:" + asText); String username = mapper.writeValueAsString(usernameNode); System.out.println("username:" + username); // 轉換成類型,Map類型,同樣Integer,String,List,也可以同樣處理 JsonNode companyNode = rootNode.path("company"); String company = mapper.writeValueAsString(companyNode); Map<String, Object> companyMap = mapper.readValue(company, Map.class); System.out.println("==company=="); System.out.println(companyMap); // 數組的處理 JsonNode carsNode = rootNode.path("cars"); System.out.println("==cars=="); Iterator<JsonNode> iterator = carsNode.elements(); System.out.print("cars: [ "); while (iterator.hasNext()) { JsonNode marks = iterator.next(); System.out.print(marks.textValue() + " "); } System.out.println("]"); // 轉換成List<Log>,類型 JsonNode logListNode = rootNode.path("logList"); String logJson = mapper.writeValueAsString(logListNode); JavaType logType = mapper.getTypeFactory().constructParametricType(List.class, Log.class); List<Log> logList = mapper.readValue(logJson, logType); System.out.println("==logList=="); System.out.println(logList); } }
package com.xc.json.JackSon; class Log { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "log [id=" + id + ", name=" + name + "]"; } }

jackson-api:
http://tool.oschina.net/apidocs/apidoc?api=jackson-1.9.9
