Java下利用Jackson进行JSON解析和序列化

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Java下利用Jackson进行JSON解析和序列化

Java下常见的Json类库有Gson、JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Java对象转换,下面给出一些Jackson的JSON操作方法。

一、项目环境准备

Jackson有1.x系列和2.x系列,2.x系列有3个jar包需要下载:

  • jackson-core-2.8.0.jar(核心jar包)- jackson-annotations-2.8.0.jar(该包提供Json注解支持)- jackson-databind-2.8.0.jar
    由于我们使用的是 maven项目,所以,我们需要导入以下的依赖。

<!-- log end -->
    <!-- 映入JSON -->
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.9.13</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.8.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.8.0</version>
    </dependency>

接下来,我们再创建一个 User用户实体,如果我们需要进行网络数据的传递的话,我们最好还是实现序列号接口。



import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

/**
 * @author 思海
 * @date 2018/5/30 10:48
 */
public class User implements Serializable {<!-- -->

    private Integer id;
    private String email;
    private String password;
    private String username;
    private String role;
    private Integer status;
    private Date regTime;
    private String regIp;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public Date getRegTime() {
        return regTime;
    }

    public void setRegTime(Date regTime) {
        this.regTime = regTime;
    }

    public String getRegIp() {
        return regIp;
    }

    public void setRegIp(String regIp) {
        this.regIp = regIp;
    }
}

二、JAVA对象转JSON[JSON序列化]


import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonDemo {<!-- -->
    public static void main(String[] args) throws ParseException, IOException {
        User user = new User();
        user.setUsername("sihai");
        user.setEmail("sihai@163.com");

        SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
        user.setBirthday(dateformat.parse("1994-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
        String json = mapper.writeValueAsString(user);
        System.out.println(json);

        //Java集合转JSON
        List&lt;User&gt; users = new ArrayList&lt;User&gt;();
        users.add(user);
        String jsonlist = mapper.writeValueAsString(users);
        System.out.println(jsonlist);
    }
}

三、JSON转JAVA类[JSON反序列化]


public class JacksonDemo {<!-- -->
    public static void main(String[] args) throws ParseException, IOException {
        String json = "{\"username\":\"sihai\",\"password\":\"sihai\",\"email\":\"sihai@163.com\"}";
        /**
         * ObjectMapper支持从byte[]、File、InputStream、字符串等数据的JSON反序列化。
         */
        ObjectMapper mapper = new ObjectMapper();
        User user = mapper.readValue(json, User.class);
        System.out.println(user);
    }
}

以上的方法还有其他的API可以使用,具体的API可以去查看API文档,这里不一一举例了。

四、JSON注解

Jackson提供了一系列注解,方便对JSON序列化和反序列化进行控制,下面介绍一些常用的注解。

  • @JsonIgnore 此注解用于属性上,作用是进行JSON操作时忽略该属性。- @JsonFormat 此注解用于属性上,作用是把Date类型直接转化为想要的格式,如@JsonFormat(pattern = “yyyy-MM-dd HH-mm-ss”)。- @JsonProperty 此注解用于属性上,作用是把该属性的名称序列化为另外一个名称,如把trueName属性序列化为name,@JsonProperty(“name”)。
    ```
    package com.sihai.shop.user.entity;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

/**

  • @author 思海
  • @date 2018/5/30 10:48

*/
public class User implements Serializable {


private Integer id;
private String email;
//不JSON序列化年龄属性
@JsonIgnore
private String password;
private String username;
private String role;
private Integer status;
//格式化日期属性
@JsonFormat(pattern = "yyyy年MM月dd日")
private Date regTime;
private String regIp;

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getRole() {
    return role;
}

public void setRole(String role) {
    this.role = role;
}

public Integer getStatus() {
    return status;
}

public void setStatus(Integer status) {
    this.status = status;
}

public Date getRegTime() {
    return regTime;
}

public void setRegTime(Date regTime) {
    this.regTime = regTime;
}

public String getRegIp() {
    return regIp;
}

public void setRegIp(String regIp) {
    this.regIp = regIp;
}

}



import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class JacksonDemo {


public static void main(String[] args) throws ParseException, IOException {
    User user = new User();
    user.setUsername("sihai");
    user.setEmail("sihai@163.com");

    SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
    user.setRegTime(dateformat.parse("1994-10-01"));

    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(user);
    System.out.println(json);
}

}

```

这就是jackson的大概的使用方法了。

原文地址:https://sihai.blog.csdn.net/article/details/80654846

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Java下利用Jackson进行JSON解析和序列化


 上一篇
“面试不败计划”——面试题基础三 “面试不败计划”——面试题基础三
1、& 和 &&的区别 首先记住&是位操作,而&&是逻辑运算符.另外需要记住逻辑运算符具有短路特性,而&不具备短路特性. publicclassTest{ static
2021-04-04
下一篇 
“面试不败计划”——集合、日期、异常、序列化、jvm、其他 “面试不败计划”——集合、日期、异常、序列化、jvm、其他
关于集合 1、Java中的集合及其继承关系 关于集合的体系是每个人都应该烂熟于心的,尤其是对我们经常使用的List,Map的原理更该如此.这里我们看这张图即可: 2、poll()方法和remove()方法区别? poll(
2021-04-04