Jackson记录

发布时间 2023-12-06 14:42:12作者: 知识海洋中的浮萍

1.基本使用,序列化和反序列化

序列化

public class JacksonTest {
   static ObjectMapper objectMapper = new ObjectMapper();
    public static void main(String[] args) throws JsonProcessingException {
        Person person = new Person();
        person.setName("jacksonTest");
        person.setAge(38);

        String str = objectMapper.writeValueAsString(person);
        System.out.println(str);//{"name":"jacksonTest","age":38}
    }
}

反序列化

public class JacksonTest {
   static ObjectMapper objectMapper = new ObjectMapper();
    public static void main(String[] args) throws IOException {
        String str = "{\"name\":\"jacksonTest\",\"age\":38}";
        Person person = objectMapper.readValue(str, Person.class);
        System.out.println(person);//Person(name=jacksonTest, age=38)
    }
}

2.反序列化,转带有泛型的,例如List<String>, Map<String, Object> 等 使用 TypeReference

public class JacksonTest {
   static ObjectMapper objectMapper = new ObjectMapper();
    public static void main(String[] args) throws IOException {
        String str = "[{\"name\":\"jacksonTest1\",\"age\":38},{\"name\":\"jacksonTest2\",\"age\":238}]";
        List<Person> l1 = objectMapper.readValue(str, new TypeReference<List<Person>>() {});
        System.out.println(l1);

        List<Person> l2 = objectMapper.readValue(str, List.class);
        System.out.println(l2);
    }
}

上述代码分别展示了使用TypeReference和未使用TypeReference的情况
主要想说明不使用TypeReference,复杂对象json数组解析出来的是map。后续如果想遍历再调用Person对象的get方法会报错
类型展示
调用Per对象get方法报错

3.类比fastJson的JsonObject -> ObjectNode, JsonArray -> ArrayNode(内部是ObjectNode)

对象 数组
fastJson JsonObject JsonArray
Jackson JsonNode ArrayNode

JsonNode (主要说明ObjectNode)

创建

JsonNode不能像JsonObject直接new

//依赖于objectMapper创建
ObjectNode objectNode = objectMapper.createObjectNode();

//不依赖与objectMapper,使用JsonNodeFactory
ObjectNode objectNode = JsonNodeFactory.instance.objectNode();

添加

JsonNode是父类,不能直接put,它的子类ObjectNode表示是一个Object
只有ObjectNode才可以使用put或putPOJO方法添加元素

删除

remove(String fieldName)

查询元素

get(String fieldName);//如果查不到,返回一个null

with(String propertyName);//只能取ObjectNode,如果对应的value不是ObjectNode,会抛异常。如果取不到,会在原始json中插入一个空Object

path(String fieldName);//如果查不到,返回的不是null,而是一个MissingNode

at(String var1);//支持更灵活的路径表达,可以用于深度导航、过滤等
//JsonNode node = rootNode.at("/path/to/node");

ArrayNode

创建

ArrayNode的创建依赖于objectMapper

ArrayNode arrayNode = objectMapper.createArrayNode();

添加

add(JsonNode value)

删除

remove(int index)

查询元素

和JsonNode使用类似,要注意方法要使用入参是integer的

4.ObjectMapper的初始化配置

objectMapper可以做一些初始化配置
DeserializationFeature 反序列化的配置
SerializationFeature 序列化的配置

DeserializationFeature 说明
USE_BIG_DECIMAL_FOR_FLOATS
SerializationFeature 说明