认识一下ObjectMapper

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

ObjectMapper类(com.fasterxml.jackson.databind.ObjectMapper)是Jackson的主要类,它将使用JsonParserJsonGenerator实例来实现JSON的实际读/写,帮助我们快速的进行各个类型和Json类型的相互转换。
复制代码

一、引入Jackson的依赖

<!-- 根据自己需要引入相关版本依赖。 -->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.9.10</version>
</dependency>

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.10</version>
</dependency>

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>2.9.10</version>
</dependency>

复制代码

二、ObjectMapper的常用配置

private static final ObjectMapper mapper;

public static ObjectMapper getObjectMapper(){
    return this.mapper;
}

static{
    //创建ObjectMapper对象
    mapper = new ObjectMapper()

    //configure方法 配置一些需要的参数
    // 转换为格式化的json 显示出来的格式美化
    mapper.enable(SerializationFeature.INDENT_OUTPUT);

   //序列化的时候序列对象的那些属性  
   //JsonInclude.Include.NON_DEFAULT 属性为默认值不序列化 
   //JsonInclude.Include.ALWAYS      所有属性
   //JsonInclude.Include.NON_EMPTY   属性为 空(“”) 或者为 NULL 都不序列化 
   //JsonInclude.Include.NON_NULL    属性为NULL 不序列化
   mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);  


    //反序列化时,遇到未知属性会不会报错 
    //true - 遇到没有的属性就报错 false - 没有的属性不会管,不会报错
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    //如果是空对象的时候,不抛异常  
    mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);  

    // 忽略 transient 修饰的属性
    mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true);

    //修改序列化后日期格式
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);  
    mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

   //处理不同的时区偏移格式
   mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
   mapper.registerModule(new JavaTimeModule());

}
复制代码

三、ObjectMapper的常用方法

//创建ObjectMapper对象
ObjectMapper mapper = new ObjectMapper();
复制代码
1、json字符串和对象互转
String jsonString = "{\"name\":\"Hyl\", \"age\":20}";

//将JOSN字符串转换为对象
Student student = mapper.readValue(jsonString, Student.class);
//JOSN字符串转对象(集合)
List<User> list = mapper.readValue(userListJsonString, new TypeReference<List<User>>(){});
System.out.println(student);

//将对象转换为json字符串
jsonString = mapper.writeValueAsString(student);
System.out.println(jsonString);
复制代码
2、数组和对象之间转换
//对象转为byte数组
byte[] byteArr = mapper.writeValueAsBytes(student);
System.out.println(byteArr);


//byte数组转为对象
Student student= mapper.readValue(byteArr, Student.class);
System.out.println(student);
复制代码
3、集合和json字符串之间转换
List<Student> studentList= new ArrayList<>();
studentList.add(new Student("hyl1" ,20 , new Date()));
studentList.add(new Student("hyl2" ,21 , new Date()));
studentList.add(new Student("hyl3" ,22 , new Date()));
studentList.add(new Student("hyl4" ,23 , new Date()));

String jsonStr = mapper.writeValueAsString(studentList);
System.out.println(jsonStr);

List<Student> studentList2 = mapper.readValue(jsonStr, List.class);
=mapper.readValue(jsonStr, new TypeReference<List<User>>(){});
System.out.println("字符串转集合:" + studentList2 );

复制代码
4、map和json字符串之间转换
Map<String, Object> testMap = new HashMap<>();
testMap.put("name", "22");
testMap.put("age", 20);
testMap.put("date", new Date());
testMap.put("student", new Student("hyl", 20, new Date()));


String jsonStr = mapper.writeValueAsString(testMap);
System.out.println(jsonStr);
Map<String, Object> testMapDes = mapper.readValue(jsonStr, Map.class);
System.out.println(testMapDes);
复制代码
5、日期转json字符串
// 修改时间格式
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
Student student = new Student ("hyl",21, new Date());
student.setIntList(Arrays.asList(1, 2, 3));

String jsonStr = mapper.writeValueAsString(student);
System.out.println(jsonStr);

结果:
{
  "name" : "hyl",
  "age" : 21,
  "sendTime" : "2020-07-23 13:14:36",
  "intList" : [ 1, 2, 3 ]
}

复制代码
6、从Reader中读取JSON
ObjectMapper objectMapper = new ObjectMapper();
String carJson ="{ "brand" : "Mercedes", "doors" : 4 }";
Reader reader = new StringReader(carJson);
Car car = objectMapper.readValue(reader, Car.class);
复制代码
7、从File中读取JSON
ObjectMapper objectMapper = new ObjectMapper();
File file = new File("data/car.json");
Car car = objectMapper.readValue(file, Car.class);
复制代码
8、从URL中读取JSON
ObjectMapper objectMapper = new ObjectMapper();
URL url = new URL("file:data/car.json");
Car car = objectMapper.readValue(url, Car.class);
复制代码
9、InputStream中读取JSON
ObjectMapper objectMapper = new ObjectMapper();
InputStream input = new FileInputStream("data/car.json");
Car car = objectMapper.readValue(input, Car.class);
---------------------------------------------------------------------------
objectMapper.readValue(request.getInputStream(), Car.class);
复制代码

猜你喜欢

转载自juejin.im/post/7129029925637472292