zoukankan      html  css  js  c++  java
  • Jackson 序列化和反序列化

    博客地址:https://www.moonxy.com

    一、前言

    Jackson 功能很强大,既能满足简单的序列化和反序列化操作,也能实现复杂的、个性化的序列化和反序列化操作。到目前为止,Jackson 的序列化和反序列化性能都非常优秀,已经是国内外大部分 JSON 相关编程的首选工具。

    Jackson从 2.0 开始改用新的包名 fasterxml,1.x 版本的包名是 codehaus。除了包名不同,他们的 Maven artifact id 也不同。1.x 版本现在只提供 bug-fix,而 2.x 版本还在不断开发和发布中。如果是新项目,建议直接用 2x,即 fasterxml jackson。

    二、Jackson 操作

    2.1 ObjectMapper 类

    ObjectMapper 类是 Jackson 库的主要类,它能够实现 Java 对象与 JSON 数据之间的序列化和反序列化。

    package lucene.file.search.tester;
    
    import java.io.IOException;
    import java.util.Date;
    import java.util.List;
    
    import com.fasterxml.jackson.core.JsonGenerationException;
    import com.fasterxml.jackson.core.JsonParseException;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.JavaType;
    import com.fasterxml.jackson.databind.JsonMappingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    /**
     * Jackson从2.0开始改用新的包名fasterxml,1.x版本的包名是codehaus。除了包名不同,他们的Maven artifact id也不同。
     * 1.x版本现在只提供bug-fix,而2.x版本还在不断开发和发布中。如果是新项目,建议直接用2x,即fasterxml jackson        
     * @author Administrator
     * jackson-core:核心包
     * jackson-annotations:注解包
     * jackson-databind:数据绑定包
     */
    public class JacksonUtil {
        
        private static ObjectMapper objectMapper = new ObjectMapper();
        
        /**
         * JSON字符串反序列化成Java对象
         * @param json
         * @return
         */
        public static UserEntity databind(String json){
            UserEntity user = null;
            try {
                user = objectMapper.readValue(json, UserEntity.class);
            } catch (JsonParseException e) {
                e.printStackTrace();
            } catch (JsonMappingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return user;
        }
        
        /**
         * Java对象序列化成JSON字符串
         * @param user
         * @return
         */
        public static String custom(UserEntity user){
            String json = null;
            try {
                json = objectMapper.writeValueAsString(user);
            } catch (JsonGenerationException e) {
                e.printStackTrace();
            } catch (JsonMappingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return json;
        }
        
        /**
         * Jackson提供了JavaType,用来指明集合类型和泛型
         * @param collectonClass
         * @param elementClasses
         * @return
         */
        public static JavaType getCollectionType(Class<?> collectonClass, Class<?>... elementClasses){
            return objectMapper.getTypeFactory().constructParametricType(collectonClass, elementClasses);
        }
        
        /**
         * 集合的反序列化
         * @param jsonArray
         * @return
         */
        public static List<UserEntity> databinds(String jsonArray){
            JavaType type = getCollectionType(List.class, UserEntity.class);
            List<UserEntity> list = null;
            try {
                list = objectMapper.readValue(jsonArray, type);
            } catch (JsonParseException e) {
                e.printStackTrace();
            } catch (JsonMappingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return list;
        }
        
        public static void main(String[] args) throws JsonProcessingException {
            //JSON字符串反序列化成Java对象
            String json = "{"name":"Rain","id":4405,"age":28,"createDate":"2018-01-25 12:17:22","phone":"13891701101"}";
            UserEntity user = databind(json);
            System.out.println(user.toString());
            
            //Java对象序列化成JSON字符串
            //UserEntity user = new UserEntity();
            user.setId(10086L);
            user.setName("Bob");
            user.setAge(18);
            user.setCreateDate(new Date());
            System.out.println(custom(user));
            
            //集合的反序列化和序列化
            String jsonArray = "[{"name":"Rain","id":4405,"age":28,"createDate":"2018-01-25 12:17:22","phone":"13891701102"},"
                    + "{"name":"Jim","id":4406,"age":26,"createDate":"2018-01-25 12:17:22","phone":"13891701103"}]";
            
            List<UserEntity> userList = databinds(jsonArray);
            for (UserEntity userEntity : userList) {
                System.out.println(userEntity.toString());
            }
            
            //集合的序列化
            System.out.println(objectMapper.writeValueAsString(userList));
    
        }
    
    }

    2.2 Jackson 常用注解

    Jackson 包含了很多注解,用来个性化序列化和反序列化操作,主要包含如下注解。

    @JsonProperty,作用在属性上,用来为 JSON Key 指定一个别名;

    @JsonIgnore,作用在属性上,用来忽略此属性;

    @JsonIgnoreProperties,忽略一组属性,作用在类上,比如 @JsonIgnorePropertiess({"id","phone"});

    @JsonAnySetter,标记在某个方法上,此方法接收 Key、Value,用于 Jackson 在反序列化过程中,未找到的对应属性都调用此方法。通常这个方法用一个 Map 来实现;

    @JsonAnyGetter,此注解标注在一个返回 Map 的方法上,Jackson 会取出 Map中的每一个值进行序列化;

    @JsonFormat,用于日期的格式化,如:

    @JsonFormat(pattern="yyyy-MM-dd HH-mm-ss")
    private Date createDate;

    @JsonNaming,用于指定一个命名策略,作用于类或者属性上,类似 @JsonProperty,但是会自动命名。Jackson 自带了多种命名策略,你也可以实现自己的命名策略,比如输入的 Key 由 Java 命名方式转换为下划线命名方式:userName 转换为 user-name;

    @JsonSerialize,指定一个实现类来自定义序列化。类必须实现 JsonSerializer 接口;

    @JsonDeserialize,用户自定义反序列化,同 @JsonSerialize,类需要实现 JsonDeserialize 接口;

    @JsonView,作用在类或者属性上,用来定义一个序列化组。Spring MVC 的 Controller 方法可以使用同样的 @JsonView 来序列化属于这一组的配置。

    观察者模式又叫做发布订阅模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生改变时就会通知所有观察着对象。它是由两类对象组成,主题和观察者,主题负责发布事件,同时观察者通过订阅这些事件来观察该主体,发布者和订阅者是完全解耦的,彼此不知道对方的存在,两者仅仅共享一个自定义事件的名称。

  • 相关阅读:
    C#高级编程第11版
    做点字符串题
    Codeforces Round #681 (Div. 1, based on VK Cup 2019-2020
    Educational Codeforces Round 97 题解
    AtCoder Regular Contest 106 题解
    Kick Start Round G 2020 题解
    CCSP 2020题解
    Codeforces Round #675 (Div. 2) 题解
    AtCoder Regular Contest 104
    Kick Start Round F 2020 题解
  • 原文地址:https://www.cnblogs.com/cnjavahome/p/8393178.html
Copyright © 2011-2022 走看看