Jackson
Spring Boot 的默认 JSON 解析器。当我们通过 starter 新建一个 Spring Boot 的 Web 项目后,就可以在 Maven 的依赖项中看到 Jackson 的身影。
在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格式,如图所示:
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);
列举了一些比较常用的方法,后面碰到了什么还会继续补充 继续加油啊!!!!