Jackson

105 阅读3分钟

Jackson

Spring Boot 的默认 JSON 解析器。当我们通过 starter 新建一个 Spring Boot 的 Web 项目后,就可以在 Maven 的依赖项中看到 Jackson 的身影。

ZNIR1ZSS342MNL}6V{O)Q.png

在Jackson库中,ObjectMapper 类是一个核心类,它提供了在Java对象和JSON之间转换的功能。readValue 和 writeValueAsString 是这个类中的两个非常重要的方法。

readValue方法

readValue 方法用于将JSON字符串或来自其他源(如文件、输入流等)的JSON数据解析为Java对象。

例如,假设你有一个JSON字符串,它表示一个User对象:

{ "name": "John Doe", "age": 30 }

你可以使用readValue方法将其解析为(也可以叫反序列化)User类的实例:

方法1

ObjectMapper mapper = new ObjectMapper(); 
String jsonString = "{\"name\":\"John Doe\",\"age\":30}"; 
User user = mapper.readValue(jsonString, User.class);

在这里,readValue的第一个参数是要解析的JSON字符串,第二个参数是目标Java类的Class对象。

方法2 假如我本地有一个文件,里面的数据是json格式,如图所示: jacksons.png

String property = System.getProperty("user.dir");  // 获取当前工作路径
String path = property + File.separator + "student.json";
System.out.println(objectMapper.readValue(new File(path), Student.class));  // 可以将文件中的数据,转成对象

在这里,readValue的第一个参数是要解析的文件,第二个参数是目标Java类的Class对象。

方法3

List<Student> students = objectMapper.readValue("[ {\n" +
                "  "age" : 1,\n" +
                "  "name" : "王五"\n" +
                "}, {\n" +
                "  "age" : 2,\n" +
                "  "name" : "李四"\n" +
                "} ]",
        new TypeReference<List<Student>>() {});  // 可以把json数组转成相对应的集合对象

writeValueAsString方法

writeValueAsString 方法则用于将Java对象转换为JSON格式的字符串。 续上面的例子,如果你有一个User对象,你可以使用writeValueAsString方法将其转换为JSON字符串:

User user = new User(); 
user.setName("王五"); 
user.setAge(30); 
ObjectMapper mapper = new ObjectMapper(); 
String jsonString = mapper.writeValueAsString(user); 
System.out.println(jsonString); // 输出: {"name":"王五","age":30}
System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(user));
/** 输出结果是
{
  "age" : 1,
  "name" : "王五"
}
*/

这里,writeValueAsString方法的参数是要转换的Java对象。

这两个方法一起提供了在Java对象和JSON之间双向转换的能力,使得在Java应用程序中处理JSON数据变得相对简单。

writeValue方法

将对象写入指定文件

String property = System.getProperty("user.dir");
String path = property + File.separator + "student.json";
// 将对象写入文件中 如果文件不存在,会创建一个
objectMapper.writeValue(new File(path),student);

补充

当我们的json字符串如下所示转化成对象时会出现错误

我们定义的student对象只有 age name属性,并没有address属性,此时就无法反序列化成指定的对象,但是我们又想也能转成指定的对象,就可以通过配置,来实现该需求

Student student = objectMapper.readValue("{\n" +
        "  "age" : 1,\n" +
        "  "name" : "王五",\n" +
        "  "address" : "北京"\n" +
        "}",Student.class);
System.out.println(student);

修改后

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);// 遇到未知属性(未映射到属性的属性)是否报错
Student student = objectMapper.readValue("{\n" +
        "  "age" : 1,\n" +
        "  "name" : "王五",\n" +
        "  "address" : "北京"\n" +
        "}",Student.class);
System.out.println(student);  // 成功打印出该对象

在开发中有时会遇到不知道是什么类型的变量(Object)可能要转成指定类型的对象,此时我们使用readValue()方法时,就不是那么好用了,此时可以采取下面的方式来实现曲线报国.

ObjectMapper objectMapper = new ObjectMapper();
// message.getPayload()是object类型
JsonNode jsonNode = objectMapper.valueToTree(message.getPayload());
Message msg = objectMapper.treeToValue(jsonNode,Message.class);

列举了一些比较常用的方法,后面碰到了什么还会继续补充 继续加油啊!!!!