zoukankan      html  css  js  c++  java
  • 带你五分钟搞定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)。

  • 相关阅读:
    Oracle Drop表并未直接删除 drop table xx purge
    Notepad++使用
    Python使用MySQL数据库
    考驾照科目二科目三要点记录
    Linux中权限(r、w、x)对于目录与文件的意义
    linux之expr命令
    linux下scp
    数字货币和区块链联系
    网站
    关于linux 编程
  • 原文地址:https://www.cnblogs.com/innosight/p/3271109.html
Copyright © 2011-2022 走看看