帶你五分鐘搞定Jackson JSON Processor

傳送門 ☞ 輪子的專欄 ☞ 轉載請註明 ☞ http://blog.csdn.net/leverage_1229

1Jackson 是什麼?

(1)崇尚速度的(傳說比其他Java json parser和data binder執行起來更快)
(2)數據流動的(讀取,寫入)
(3)完全獨立的(獨立於JDK之外的其他包)
(4)火力十足的(爲通用JDK類提供完整的數據綁定,就像Java bean class, Collection, Map or Enum),可配置的
(5)開放源代碼的(Apache License – or, until 2.1, alternatively LGPL)
        Jackson就是這樣一個具有上述五大特性的JSON處理器。它提供JSON解析與JSON構建作爲基礎構造塊,另有一個功能強大的數據綁定器(支持JSON與POJO相互轉換)和樹型結構作爲可選附加塊。
        也就是說,你可以通過調用流式API、POJO數據綁定、樹型結構三種方式來生成和解析JSON。

2JSON三種方式

(1)流式API:讀取和寫入JSON內容視作離散事件。
org.codehaus.jackson.JsonParser reads
org.codehaus.jackson.JsonGenerator writes
(2)樹型:提供一個JSON文檔的可變內存樹的表示形式。
org.codehaus.jackson.map.ObjectMapper 生成樹;該樹由JsonNode節點組成
樹型類似於XML DOM
(3)數據綁定:提供基於屬性訪問器規約或註解的JSON和POJO相互轉換。
有兩種形式:簡單數據綁定和完整數據綁定:
簡單數據綁定:從Java Map、List、String、Numbers、Boolean和空值進行轉換
完整數據綁定:從任何Java bean類型(以及“簡單”類型)進行轉換
org.codehaus.jackson.map.ObjectMapper 對這兩種形式進行編組處理(寫入 JSON)和逆向編組(讀取 JSON)
(4)使用特點
性能最好的是流式API,另外兩種方式都是基於它實現的;使用最方便的是數據綁定;最靈活的是樹型。

3示例

3.1工程包目錄


3.2完整數據綁定(POJO)

(1)Json字符串:data.json
{
   "name" : { "first" : "Joe", "last" : "Sixpack" },
   "gender" : "MALE",
   "verified" : false,
   "userImage" : "Rm9vYmFyIQ=="
}
(2)Json轉換成實體類:json2Entity()
    /**
     * 將Json字符串轉換成實體類
     */
    public static void json2Entity() {
        try {
            User user = mapper.readValue(new File("src/com/roctec/json/data.json"), User.class);
            System.out.println(user);
        } catch (JsonParseException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
(3)實體類:User.java
package com.roctec.entity;

import java.util.Arrays;

public class User {
    public enum Gender {
        MALE, FEMALE
    };

    public static class Name {
        private String _first, _last;

        public String getFirst() {
            return _first;
        }

        public String getLast() {
            return _last;
        }

        public void setFirst(String s) {
            _first = s;
        }

        public void setLast(String s) {
            _last = s;
        }
    }

    private Gender _gender;
    private Name _name;
    private boolean _isVerified;
    private byte[] _userImage;

    public Name getName() {
        return _name;
    }

    public boolean isVerified() {
        return _isVerified;
    }

    public Gender getGender() {
        return _gender;
    }

    public byte[] getUserImage() {
        return _userImage;
    }

    public void setName(Name n) {
        _name = n;
    }

    public void setVerified(boolean b) {
        _isVerified = b;
    }

    public void setGender(Gender g) {
        _gender = g;
    }

    public void setUserImage(byte[] b) {
        _userImage = b;
    }

    @Override
    public String toString() {
        return "User [_gender=" + _gender + ", _name=[_first=" + _name._first + ", _last=" + _name._last
                + "], _isVerified=" + _isVerified + ", _userImage="
                + Arrays.toString(_userImage) + "]";
    }
}
(4)實體類轉換成Json:entity2Json()
   /**
     * 將實體類轉換成Json字符串
     */
    public static void entity2Json() {
        User user = new User();
        User.Name name = new User.Name();
        name.setFirst("Joe");
        name.setLast("Sixpack");
        user.setName(name);
        user.setGender(User.Gender.MALE);
        user.setVerified(false);
        user.setUserImage("Rm9vYmFyIQ==".getBytes());
        try {
            mapper.writeValue(new File("src/com/roctec/json/entity.json"), user);
        } catch (JsonGenerationException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3.3簡單數據綁定(Map)

(1)Json轉換成Map:json2Map()
    /**
     * 將Json字符串轉換成map
     */
    public static void json2Map() {
        try {
            @SuppressWarnings("unchecked")
            Map<String, Object> map = mapper.readValue(new File("src/com/roctec/json/data.json"), Map.class);
            for (Map.Entry<String, Object> entity : map.entrySet()) {
                System.out.println(entity.getKey() + "=" + entity.getValue());
            }
        } catch (JsonParseException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
(2)Map轉換成Json:map2Json()
    /**
     * 將map轉換成Json字符串
     */
    public static void map2Json() {
        Map<String,Object> map = new HashMap<String,Object>();
        Map<String,String> name = new HashMap<String,String>();
        name.put("first", "Joe");
        name.put("last", "Sixpack");
        map.put("name", name);
        map.put("gender", "MALE");
        map.put("verified", Boolean.FALSE);
        map.put("userImage", "Rm9vYmFyIQ==");
        try {
            mapper.writeValue(new File("src/com/roctec/json/map.json"), map);
        } catch (JsonParseException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3.4樹型綁定

(1)Json轉換成樹形:json2Tree()
    /**
     * 將Json字符串轉換成樹形
     */
    public static void json2Tree() {
        try {
            // 使用mapper.readTree(source),或使用mapper.readValue(source, JsonNode.class);
            JsonNode rootNode = mapper.readTree(new File("src/com/roctec/json/data.json"));
            // 確保"last name"不是"Xmler";如果是,就轉換爲"Jsoner"
            JsonNode nameNode = rootNode.path("name");
            String lastName = nameNode.path("last").getTextValue();
            if("xmler".equalsIgnoreCase(lastName)) {
                ((ObjectNode)nameNode).put("last", "Jsoner");
            }
            mapper.writeValue(new File("src/com/roctec/json/tree.json"), rootNode);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }
(2)樹形轉換成Json:json2Tree()
    /**
     * 將樹形轉換成Json字符串
     */
    public static void tree2Json() {
        ObjectNode rootNode = mapper.createObjectNode();
        ObjectNode nameNode = rootNode.putObject("name");
        nameNode.put("first", "Joe");
        nameNode.put("last", "Sixpack");
        rootNode.put("gender", User.Gender.MALE.toString());
        rootNode.put("verified", false);
        byte[] imageBuf = "Rm9vYmFyIQ==".getBytes();
        rootNode.put("userImage", imageBuf);
        try {
            mapper.writeValue(new File("src/com/roctec/json/tree.json"), rootNode);
        } catch (JsonGenerationException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3.5流式API

(1)生成Json:generateJson()
    /**
     * 構造Json字符串
     */
    public static void generateJson() {
        try {
            JsonFactory factory = mapper.getJsonFactory();
            JsonGenerator generator = factory.createJsonGenerator(new File("src/com/roctec/json/write.json"), JsonEncoding.UTF8);
            generator.writeStartObject();
            generator.writeObjectFieldStart("name");
            generator.writeStringField("first", "Joe");
            generator.writeStringField("last", "Sixpack");
            generator.writeEndObject();
            generator.writeStringField("gender", User.Gender.MALE.toString());
            generator.writeBooleanField("verified", false);
            generator.writeFieldName("userImage");
            byte[] imageBuf = "Rm9vYmFyIQ==".getBytes();
            generator.writeBinary(imageBuf);
            generator.writeEndObject();
            generator.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
(2)解析Json:parseJson()
    /**
     * 解析Json字符串
     */
    public static void parseJson() {
        try {
            JsonFactory factory = mapper.getJsonFactory();
            JsonParser parser = factory.createJsonParser(new File("src/com/roctec/json/data.json"));
            User user = new User();
            parser.nextToken();
            while(parser.nextToken() != JsonToken.END_OBJECT) {
                String fieldName = parser.getCurrentName();
                parser.nextToken();
                if("name".equals(fieldName)) {
                    User.Name name = new User.Name();
                    while(parser.nextToken() != JsonToken.END_OBJECT) {
                        String nameField = parser.getCurrentName();
                        parser.nextToken();
                        if("first".equals(nameField)) {
                            name.setFirst(parser.getText());
                        } else if("last".equals(nameField)) {
                            name.setLast(parser.getText());
                        } else {
                            throw new IllegalStateException("Unrecognized field '" + fieldName + "'!");
                        }
                    }
                    user.setName(name);
                } else if("gender".equals(fieldName)) {
                    user.setGender(User.Gender.valueOf(parser.getText()));
                } else if("verified".equals(fieldName)) {
                    user.setVerified(parser.getCurrentToken() == JsonToken.VALUE_TRUE);
                } else if("userImage".equals(fieldName)) {
                    user.setUserImage(parser.getBinaryValue());
                } else {
                    throw new IllegalStateException("Unrecognized field '" + fieldName + "'!");
                }
            }
            parser.close();
            System.out.println(user);
        } catch (JsonParseException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
(3)解析Json數組:parseJsonArray()
    /**
     * 解析Json數組
     */
    public static void parseJsonArray() {
        String json = "[{\"foo\": \"bar\"}, {\"foo\": \"biz\"}]";
        try {
            JsonFactory factory = mapper.getJsonFactory();
            JsonParser parser = factory.createJsonParser(json);
            parser.nextToken();
            while(parser.nextToken() == JsonToken.START_OBJECT) {
                Foo foo = mapper.readValue(parser, Foo.class);
                System.out.println(foo);
            }
            parser.close();
        } catch (JsonParseException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
(4)實體類:Foo.java
package com.roctec.entity;

public class Foo {
    public String foo;

    public String getFoo() {
        return foo;
    }

    public void setFoo(String foo) {
        this.foo = foo;
    }

    @Override
    public String toString() {
        return "Foo [foo=" + foo + "]";
    }
    
}

        最後介紹一個竅門:可以通過JsonParser和JsonGenerator直接實現數據綁定和樹型。請查看如下方法:
JsonParser.readValueAs()
JsonParser.readValueAsTree()
JsonGenerator.writeObject()
JsonGenerator.writeTree()
        注意一點,確保使用的org.codehaus.jackson.map.MappingJsonFactory是“適用數據綁定”的解析器和生成器實例(而非基本的org.codehaus.jackson.JsonFactory)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章