使用Jackson來實現Java對象與JSON的相互轉換的教程_java

來源:互聯網
上載者:User

一、入門
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();    }  } 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.