您的位置 首页 java

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.2.3.jar(核心jar包)

jackson-annotations-2.2.3.jar(该包提供Json注解支持)

jackson-databind-2.2.3.jar

maven依赖就够了

<dependency>
 <groupId>com.fasterxml.jackson.core</groupId>
 <artifactId>jackson-databind</artifactId>
 <version>2.5.3</version>
</dependency>
 

image.png

import java.util.Date;
/**
 * JSON 序列化 和反序列化使用的User类
 */public class User {
 private String name;
 private Integer age;
 private Date birthday;
 private String email;
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public Integer getAge() {
 return age;
 }
 public void setAge(Integer age) {
 this.age = age;
 }
 public Date getBirthday() {
 return birthday;
 }
 public void setBirthday(Date birthday) {
 this.birthday = birthday;
 }
 public String getEmail() {
 return email;
 }
 public void setEmail(String email) {
 this.email = email;
 }
 @Override
 public String toString() {
 return "User{" +
 "name='" + name + ''' +
 ", age=" + age +
 ", birthday=" + birthday +
 ", email='" + email + ''' +
 '}';
 }
}
 

二、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.setName("zhangsan");
 user.setEmail("zhangsan@163.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":"zhangsan","age":20,"birthday":844099200000,"email":"zhangsan@163.com"}
 String json = mapper.writeValueAsString(user);
 System.out.println(json);
 //Java集合转JSON
 //输出结果:[{"name":"zhangsan","age":20,"birthday":844099200000,"email":"zhangsan@163.com"}]
 List<User>  users  = new ArrayList<User>();
 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 = "{"name":"zhangsan","age":20,"birthday":844099200000,"email":"zhangsan@163.com"}";
 /**
 * ObjectMapper支持从byte[]、File、InputStream、字符串等数据的JSON反序列化。
 */ ObjectMapper mapper = new ObjectMapper();
 User user = mapper.readValue(json, User.class);
 System.out.println(user);
 }
}
User{name='zhangsan', age=20, birthday=Tue Oct 01 00:00:00 CST 1996, email='zhangsan@163.com'}
public class JacksonDemo {
 public static ObjectMapper mapper = new ObjectMapper();
 public static void main(String[] args) throws ParseException, IOException {
 String json = "[{"name":"zhangsan","age":20,"birthday":844099200000,"email":"zhangsan@163.com"}]";
 List<User> beanList = mapper.readValue(json, new TypeReference<List<User>>() {});
 System.out.println(beanList);
 }
}
[User{name='zhangsan', age=20, birthday=Tue Oct 01 00:00:00 CST 1996, email='zhangsan@163.com'}]
 

四、JSON注解

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

@JsonIgnore 此注解用于属性上,作用是进行JSON操作时忽略该属性。

@JsonFormat 此注解用于属性上,作用是把Date类型直接转化为想要的格式,如@JsonFormat(pattern = “yyyy-MM-dd HH-mm-ss”)。

@JsonProperty 此注解用于属性上,作用是把该属性的名称序列化为另外一个名称,如把trueName属性序列化为name,@JsonProperty(“name”)。

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.Date;
/**
 * JSON序列化和反序列化使用的User类
 */public class User {
 private String name;
 //不JSON序列化年龄属性
 @JsonIgnore
 private Integer age;
 //格式化日期属性
 @JsonFormat(pattern = "yyyy年MM月dd日")
 private Date birthday;
 //序列化email属性为mail
 @JsonProperty("my_email")
 private String email;
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public Integer getAge() {
 return age;
 }
 public void setAge(Integer age) {
 this.age = age;
 }
 public Date getBirthday() {
 return birthday;
 }
 public void setBirthday(Date birthday) {
 this.birthday = birthday;
 }
 public String getEmail() {
 return email;
 }
 public void setEmail(String email) {
 this.email = email;
 }
 @Override
 public String toString() {
 return "User{" +
 "name='" + name + ''' +
 ", age=" + age +
 ", birthday=" + birthday +
 ", email='" + email + ''' +
 '}';
 }
}
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.setName("zhangsan");
 user.setEmail("zhangsan@163.com");
 user.setAge(20);
 SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
 user.setBirthday(dateformat.parse("1996-10-01"));
 ObjectMapper mapper = new ObjectMapper();
 String json = mapper.writeValueAsString(user);
 System.out.println(json);
 }
}
{"name":"zhangsan","birthday":"1996年09月30日","my_email":"zhangsan@163.com"}
 

Jackson常用注解详解:@JsonProperty

最常见的使用方式之一就是改变某个成员属性所使用的JSON名称,例如:

public class Name { 
 @JsonProperty("firstName") 
 public String _first_name; 
}
 

将会生成如下所示的JSON数据结果:

{ “firstName” : “Bob” }

而不是:

{ “_first_name” : “Bob”}

忽略属性时使用的注解: @JsonIgnore

有时POJO包括了一些你不希望输出的属性,在这种情况下,你可以进行如下操作:

public class Value { 
 public int value; 
 @JsonIgnore 
 public int internalValue; 
} 
 

这时得到的JSON数据结果如下:

{ “value” : 42 }

或者,你可能忽略掉某些从JSON数据中得到的属性,如果是这样,你可以使用:

@JsonIgnoreProperties({ "extra", "uselessValue" }) 
public class Value { 
 public int value; 
}
 

这样就能够处理像如下所示的JSON数据:

{ 
 "value" : 42,
 "extra" : "fluffy",
 "uselessValue" : -13
 } 
 

最后,你甚至能简单地忽略掉从JSON(由于在应用中没有完全匹配的POJO)中获得的所有“多余的”属性。你可以通过添加如下代码完成这个操作:

@JsonIgnoreProperties(ignoreUnknown=true) 
public class PojoWithAny { 
 public int value; 
}
 

选择更多/更少指定类型时使用的注解

在有些情况下,Jackson在读入或输出一个成员属性时,所选用的类型可能并不是你想要的:

当读取(反序列化)时,声明的类型可能是一个基本类型,但是你确切地知道应该使用的实现类型(ps:也就说,我们需要反序列化后生成的对象是实现类型的)

当输出(序列化)时,Jackson默认使用的是给定的运行时类型;但是你可能不想输出那个类型的所有信息,而仅仅是它的父类型所囊括的信息。

在这些应用场景,你可以使用如下的注解进行处理:

public class ValueContainer { 
 // 虽然代码中使用的类型是 Value, 但我们希望读取到的JSON 之后得到的对象的类型是 ValueImpl 
 @JsonDeserialize(as=ValueImpl.class) 
 public Value value; 
 // 虽然运行时的类型可能是 AdvancedType , 但是我们确实想序列化 
 // 成为 BasicType ; 有两种处理方式: 
 @JsonSerialize(as=BasicType.class) 
 // 或者我们可以这样: @JsonSerialize(typing=Typing.STATIC) 
 public BasicType another; 
}
 

以上就是我的分享,感谢各位大佬们耐心看完文章,觉得有收获的朋友们可以点个关注收藏转发

文章来源:智云一二三科技

文章标题:Java下利用Jackson进行JSON解析和序列化

文章地址:https://www.zhihuclub.com/186413.shtml

关于作者: 智云科技

热门文章

评论已关闭

3条评论

  1. Psychol Rep 68 819 826, 1991 Their widespread adoption also means that medical histories for each patient can be readily available for quantitative analysis at limited additional cost

  2. RAD- 140 can be used for bulking or cutting depending on your individual circumstances whereas most other SARMs are better suited to one specific goal over the other

网站地图