Jackson反序列化遇到泛型数据的处理方案

Jackson泛型序列化和反序列化问题

基础数据类型序列化和反序列化
// 省略getter/setter/toString 方法
public class Person {

    private long id;
    @JsonProperty("Career_description")
    private String description;

    @JsonProperty("birth_name")
    private String name;

	//Date类型的处理方式,格式化输出
    @JsonProperty("date")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
    private Date date;
    }
	```


public class JsonTest {

public static void main(String[] args) {
    ObjectMapper mapper = new ObjectMapper();
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    Person person = new Person();
    person.setId(1);
    person.setDescription("person description");
    person.setName("kenny");
    person.setDate(Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant()));
    String jsonString = "null";
    try {
        jsonString= mapper.writerWithDefaultPrettyPrinter().writeValueAsString(person);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    System.out.println(jsonString);

    try {
        Person deserialized = mapper.readValue(jsonString,Person.class);
        System.out.println(deserialized.toString());

    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

//output: { "id" : 1, "Career_description" : "person description", "birth_name" : "kenny", "date" : "2018-10-23 16:48" } Person{id=1, description='person description', name='kenny', date=Tue Oct 23 16:48:00 CST 2018}


对于简单的数据类型,jackson能够很方便跟json字符串进行序列化与反序列化,对于泛型情况需要`TypeReference`处理

#### 基础数据类型序列化和反序列化

```java
// 省略getter/setter/toString 方法
public class User {

    private String username;
    private String age;
}
// 省略getter/setter/toString 方法

// 1. 将List<User>泛型化
public class Response<T> {

    private int status;
    private String message;
    private T data;
}
public class ResponseJson {

    public static void main(String[] args) {

        User user1 = new User();
        user1.setAge("16");
        user1.setUsername("kenny");
        User user2 = new User();
        user2.setAge("20");
        user2.setUsername("kai");

        List<User> list = new ArrayList<>();
        list.add(user1);
        list.add(user2);
        Response response = new Response();
        response.setData(list);
        response.setMessage("get message");
        response.setStatus(1000);
        ObjectMapper mapper = new ObjectMapper();

        String json = null;
        try {
            json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(response);
            System.out.println(json);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        try {
			// 2. TypeReference指定具体的数据类型
            Response<List<User>> response1 = mapper.readValue(json,new TypeReference<Response<List<User>>>(){});
            System.out.println(response1.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
//output
{
  "status" : 1000,
  "message" : "get message",
  "data" : [ {
    "username" : "kenny",
    "age" : "16"
  }, {
    "username" : "kai",
    "age" : "20"
  } ]
}
Response{status=1000, message='get message', data=[User{username='kenny', age='16'}, User{username='kai', age='20'}]}

Process finished with exit code 0

[reference] https://www.imooc.com/article/20950

转载于:https://my.oschina.net/iak1001/blog/2251370

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值