jackson的使用

169 阅读2分钟

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。

大佬们日常应该都经常遇到json的转换的问题,对象转json,json转对象什么的都应该比较常见。redis缓存某些数据的时候都是对象转换为json字符串存进去,用的时候转成对象用。json和对象的互转可以用jackson,Gson,fastjson等。我之前是比较喜欢fastjson的,不过后面fastjson不是爆了一波雷吗,就有大佬告诉我别用fastjson了。最近就用上了jackson,感觉还是挺好用的。

@Data
public class Dog {

    private String name;

    private Integer age;
}
public static void main(String[] args) throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    Dog dog = new Dog();
    dog.setName("旺旺");
    dog.setAge(10);
    String dogJson = objectMapper.writeValueAsString(dog);
    System.out.println(dogJson);
    Dog myDog = objectMapper.readValue(dogJson, Dog.class);
    System.out.println(myDog);
}

先简单使用下json,写我一般都用writeValueAsString,将其写成一个字符串。读一般使用readValue。这个估计大佬们应该都懂,我想说的是下面的这个操作。

image.png

在转换的过程中我们会不会经常遇到一些带上泛型的对象,或者就是一个List,或者map

public static void main(String[] args) throws JsonProcessingException {
    List<Dog> dogList = new ArrayList<>();
    Dog dogA = new Dog();
    dogA.setName("旺旺");
    dogA.setAge(1);
    Dog dogB = new Dog();
    dogA.setName("汪汪");
    dogA.setAge(3);
    dogList.add(dogA);
    dogList.add(dogB);

    ObjectMapper objectMapper = new ObjectMapper();
    String dogString = objectMapper.writeValueAsString(dogList);
    System.out.println(dogString);
    List<Dog> list = objectMapper.readValue(dogString, List.class);
    System.out.println(list);
}

image.png

这样写好像是没得问题,但看看这里是(下图)不是直接就警告了。稍微有点强迫症的是不是就感觉不能忍受,那么我们怎么办呢(其实感觉自己还是可以忍受的,不过修改这些警告也是有助于提升代码质量的,所以我还是改了)?

image.png

只需要修改增加一点点代码就不会有这个警告了。这样不就没有了吗?而且这个constructParametricType方法是个也传递多个类定义的。比如Map<String,Integer>就使用constructParametricType(Map.class,String.class,Integer.class),都可以让你不再看到这讨厌的警告。

image.png

List<Dog> dogList = new ArrayList<>();
Dog dogA = new Dog();
dogA.setName("旺旺");
dogA.setAge(1);
Dog dogB = new Dog();
dogA.setName("汪汪");
dogA.setAge(3);
dogList.add(dogA);
dogList.add(dogB);

ObjectMapper objectMapper = new ObjectMapper();
String dogString = objectMapper.writeValueAsString(dogList);
System.out.println(dogString);
JavaType javaType = objectMapper.getTypeFactory().constructParametricType(List.class, Dog.class);
List<Dog> list = objectMapper.readValue(dogString, javaType);
System.out.println(list);