一、入門
Jackson中有個ObjectMapper類很是實用,用於Java對象與JSON的互換。
1.JAVA對象轉JSON[JSON序列化]
import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonDemo { public static void main(String[] args) throws ParseException, IOException { User user = new User(); user.setName("小民"); user.setEmail("xiaomin@sina.com"); user.setAge(20); SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd"); user.setBirthday(dateformat.parse("1996-10-01")); /** * ObjectMapper是JSON操作的核心,Jackson的所有JSON操作都是在ObjectMapper中實現。 * ObjectMapper有多個JSON序列化的方法,可以把JSON字串儲存File、OutputStream等不同的介質中。 * writeValue(File arg0, Object arg1)把arg1轉成json序列,並儲存到arg0檔案中。 * writeValue(OutputStream arg0, Object arg1)把arg1轉成json序列,並儲存到arg0輸出資料流中。 * writeValueAsBytes(Object arg0)把arg0轉成json序列,並把結果輸出成位元組數組。 * writeValueAsString(Object arg0)把arg0轉成json序列,並把結果輸出成字串。 */ ObjectMapper mapper = new ObjectMapper(); //User類轉JSON //輸出結果:{"name":"小民","age":20,"birthday":844099200000,"email":"xiaomin@sina.com"} String json = mapper.writeValueAsString(user); System.out.println(json); //Java集合轉JSON //輸出結果:[{"name":"小民","age":20,"birthday":844099200000,"email":"xiaomin@sina.com"}] List<User> users = new ArrayList<User>(); users.add(user); String jsonlist = mapper.writeValueAsString(users); System.out.println(jsonlist); } }
2.JSON轉Java類[JSON還原序列化]
import java.io.IOException; import java.text.ParseException; import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonDemo { public static void main(String[] args) throws ParseException, IOException { String json = "{\"name\":\"小民\",\"age\":20,\"birthday\":844099200000,\"email\":\"xiaomin@sina.com\"}"; /** * ObjectMapper支援從byte[]、File、InputStream、字串等資料的JSON還原序列化。 */ ObjectMapper mapper = new ObjectMapper(); User user = mapper.readValue(json, User.class); System.out.println(user); } }
二、Jackson支援3種使用方式:
1、Data Binding:最方便使用.
(1)Full Data Binding:
private static final String MODEL_BINDING = "{\"name\":\"name1\",\"type\":1}"; public void fullDataBinding() throws Exception{ ObjectMapper mapper = new ObjectMapper(); Model user = mapper.readValue(MODEL_BINDING, Model.class);//readValue到一個實體類中. System.out.println(user.getName()); System.out.println(user.getType()); }
Model類:
private static class Model{ private String name; private int type; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getType() { return type; } public void setType(int type) { this.type = type; } }
(2)Raw Data Binding:
/** Concrete Java types that Jackson will use for simple data binding are: JSON Type Java Type object LinkedHashMap<String,Object> array ArrayList<Object> string String number(no fraction) Integer, Long or BigInteger (smallest applicable) number(fraction) Double(configurable to use BigDecimal) true|false Boolean null null */ public void rawDataBinding() throws Exception{ ObjectMapper mapper = new ObjectMapper(); HashMap map = mapper.readValue(MODEL_BINDING,HashMap.class);//readValue到一個未經處理資料類型. System.out.println(map.get("name")); System.out.println(map.get("type")); }
(3)generic Data Binding:
private static final String GENERIC_BINDING = "{\"key1\":{\"name\":\"name2\",\"type\":2},\"key2\":{\"name\":\"name3\",\"type\":3}}"; public void genericDataBinding() throws Exception{ ObjectMapper mapper = new ObjectMapper(); HashMap<String,Model> modelMap = mapper.readValue(GENERIC_BINDING,new TypeReference<HashMap<String,Model>>(){});//readValue到一個範型資料中. Model model = modelMap.get("key2"); System.out.println(model.getName()); System.out.println(model.getType()); }
2、Tree Model:最靈活。
private static final String TREE_MODEL_BINDING = "{\"treekey1\":\"treevalue1\",\"treekey2\":\"treevalue2\",\"children\":[{\"childkey1\":\"childkey1\"}]}"; public void treeModelBinding() throws Exception{ ObjectMapper mapper = new ObjectMapper(); JsonNode rootNode = mapper.readTree(TREE_MODEL_BINDING); //path與get作用相同,但是當找不到該節點的時候,返回missing node而不是Null. String treekey2value = rootNode.path("treekey2").getTextValue();// System.out.println("treekey2value:" + treekey2value); JsonNode childrenNode = rootNode.path("children"); String childkey1Value = childrenNode.get(0).path("childkey1").getTextValue(); System.out.println("childkey1Value:"+childkey1Value); //建立根節點 ObjectNode root = mapper.createObjectNode(); //建立子節點1 ObjectNode node1 = mapper.createObjectNode(); node1.put("nodekey1",1); node1.put("nodekey2",2); //綁定子節點1 root.put("child",node1); //數組節點 ArrayNode arrayNode = mapper.createArrayNode(); arrayNode.add(node1); arrayNode.add(1); //綁定數組節點 root.put("arraynode", arrayNode); //JSON讀到樹節點 JsonNode valueToTreeNode = mapper.valueToTree(TREE_MODEL_BINDING); //綁定JSON節點 root.put("valuetotreenode",valueToTreeNode); //JSON綁定到JSON節點對象 JsonNode bindJsonNode = mapper.readValue(GENERIC_BINDING, JsonNode.class);//綁定JSON到JSON節點對象. //綁定JSON節點 root.put("bindJsonNode",bindJsonNode); System.out.println(mapper.writeValueAsString(root)); }
3、Streaming API:最佳效能。
對於效能要求高的程式,推薦使用流API,否則使用其他方法
不管是建立JsonGenerator還是JsonParser,都是使用JsonFactory。
package com.jingshou.jackson; import java.io.File; import java.io.IOException; import com.fasterxml.jackson.core.JsonEncoding; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; public class JacksonTest6 { public static void main(String[] args) throws IOException { JsonFactory jfactory = new JsonFactory(); /*** write to file ***/ JsonGenerator jGenerator = jfactory.createGenerator(new File( "c:\\user.json"), JsonEncoding.UTF8); jGenerator.writeStartObject(); // { jGenerator.writeStringField("name", "mkyong"); // "name" : "mkyong" jGenerator.writeNumberField("age", 29); // "age" : 29 jGenerator.writeFieldName("messages"); // "messages" : jGenerator.writeStartArray(); // [ jGenerator.writeString("msg 1"); // "msg 1" jGenerator.writeString("msg 2"); // "msg 2" jGenerator.writeString("msg 3"); // "msg 3" jGenerator.writeEndArray(); // ] jGenerator.writeEndObject(); // } jGenerator.close(); /*** read from file ***/ JsonParser jParser = jfactory.createParser(new File("c:\\user.json")); // loop until token equal to "}" while (jParser.nextToken() != JsonToken.END_OBJECT) { String fieldname = jParser.getCurrentName(); if ("name".equals(fieldname)) { // current token is "name", // move to next, which is "name"'s value jParser.nextToken(); System.out.println(jParser.getText()); // display mkyong } if ("age".equals(fieldname)) { // current token is "age", // move to next, which is "name"'s value jParser.nextToken(); System.out.println(jParser.getIntValue()); // display 29 } if ("messages".equals(fieldname)) { jParser.nextToken(); // current token is "[", move next // messages is array, loop until token equal to "]" while (jParser.nextToken() != JsonToken.END_ARRAY) { // display msg1, msg2, msg3 System.out.println(jParser.getText()); } } } jParser.close(); } }