SpringBoot中默认json转换工具Jackson

Spring Boot 内置了jackson来完成JSON的序列化和反序列化操作。Jackson使用ObjectMapper类将POJO对象序列化成JSON字符串,也能将JSON字符串反序列化成POJO对象。

JackSon支持三种层次的序列化和反序列化方式:

  • 采用JsonParser来解析JSON,解析结果是一串Tokens,采用JsonGenerator来生成JSON,这是最底层的方式。
  • 采用树遍历方式,JSON被读入到JsonNode对象中,可以像操作XML DOM那样读取JSON。
  • 采用DataBind方式,将POJO序列化成JSON,或者反序列化到POJO,这是最直接和最简单的一种方式,不过有时候需要辅助Jackson的注解或者上述序列化实现类来个性化序列化和反序列化操作。

1.对象绑定

应用程序更常见的是使用Java对象来与JSON数据互相绑定,仅仅调用ObjectMapper的readValue来实现,我们现在举个例子,可以创建一个POJO对象来与JSON相对应,POJO类如下:

public class User {
  Long id;
  String name;
  public Long getId() {return id;}
  public void setId(Long id) {this.id = id;}
  public String getName() {return name;}
  public void setName(String name) {this.name = name;}
}

(1)使用readValue方法来反序列化上面的JSON字符串,即json转换为对象:

@Autowired
private ObjectMapper mapper;	

@GetMapping("/dataBind.json")
public @ResponseBody String dataBind() throws IOException{
	String json = "{"name":"lijz","id":10}";
	User user = mapper.readValue(json, User.class);
	return "name:"+user.getName()+",id:"+user.getId();
}

 (2)将POJO序列化成JSON,使用mapper的writeValueAsString方法

@Autowired
private ObjectMapper mapper;	

@GetMapping("/serialization.json")
public @ResponseBody String dataBind() throws IOException{
	User user = new User();
	user.setName("scg");
	user.setId((long) 18);
	String jsonStr = mapper.writeValueAsString(user);
	return jsonStr;
}

(3)json转集合

 json转集合比较麻烦,因为你无法同时把集合的class和元素的class同时传递到一个参数。因此Jackson做了一个类型工厂,用来解决这个问题:

// json处理工具
private ObjectMapper mapper = new ObjectMapper();
@Test
public void testJson() throws IOException {
    User user = new User();
    user.setId(8L);
    user.setAge(21);
    user.setName("柳岩");
    user.setUserName("liuyan");

    // 序列化,得到对象集合的json字符串
    String json = mapper.writeValueAsString(Arrays.asList(user, user));

    // 反序列化,接收两个参数:json数据,反序列化的目标类字节码
    List<User> users = mapper.readValue(json, mapper.getTypeFactory().constructCollectionType(List.class, User.class));
    for (User u : users) {
        System.out.println("u = " + u);
    }
}

 (4)json转任意复杂类型

 当对象泛型关系复杂时,类型工厂也不好使了。这个时候Jackson提供了TypeReference来接收类型泛型,然后底层通过反射来获取泛型上的具体类型。实现数据转换。

// json处理工具
private ObjectMapper mapper = new ObjectMapper();
@Test
public void testJson() throws IOException {
    User user = new User();
    user.setId(8L);
    user.setAge(21);
    user.setName("柳岩");
    user.setUserName("liuyan");

    // 序列化,得到对象集合的json字符串
    String json = mapper.writeValueAsString(Arrays.asList(user, user));

    // 反序列化,接收两个参数:json数据,反序列化的目标类字节码
    List<User> users = mapper.readValue(json, new TypeReference<List<User>>(){});
    for (User u : users) {
        System.out.println("u = " + u);
    }
}

2.Jackson 注解

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

(1)@JsonProperty,作用在属性上,用来为JSON Key指定一个别名。

@JsonProperty("userName")
private String name;

 (2)@JsonIgnore,作用在属性上,用来忽略此属性。

@JsonIgnore
private String age;

(3)@JsonIgnoreProperties,忽略一组属性,作用于类上

@JsonIgnoreProperties({"id","photo"})
public class User {}

(4)@JsonFormat,用于日期格式化。

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

(5)@JsonView,作用在类或者属性上,用来定义一个序列化组。Spring MVC的Controller方法可以使用同样的@JsonView来序列化属于这一组的配置。比如对于User对象,某些情况下只返回id属性就行,而某些情况下需要返回id和名称。代码如下:

public class User {
	public interface IdView{};
	public interface IdNameView extends IdView{};
	
	@JsonView(IdView.class)
	private Integer id;
	@JsonView(IdNameView.class)
	private String name;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
/**
* controller
 */
@JsonView(User.IdView.class)
@RequestMapping("/id.json")
public @ResponseBody User queryIds(){
	User user = new User();
	user.setId(1);
	user.setName("scg");
	return user;
}

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

猜你喜欢

转载自blog.csdn.net/u013089490/article/details/83585794