Java 操作 JSON 数据(4)()

  本篇文章为你整理了Java 操作 JSON 数据(4)()的详细内容,包含有 Java 操作 JSON 数据(4),希望能帮助你了解 Java 操作 JSON 数据(4)。

  Jackson 是 SpringBoot 默认使用的 JSON 处理库,它可以轻松的将 Java 对象转换成 JSON 对象,同样也可以将 JSON 转换成 Java对 象。本文介绍下 Jackson 的基本使用方法,包括序列化和反序列化;文中所使用到的软件版本:Java 1.8.0_321、Jackson 2.13.3。

  Jackson 被称为 Java JSON 库 或 Java 最佳 JSON 解析器,或者干脆写成 “JSON for Java”。更重要的是,Jackson 是一套 Java 平台的 数据处理(不限于JSON) 工具集:包括 一流的 JSON 解析器/JSON 生成器、数据绑定库(POJOs to and from JSON);并且提供了相关模块来支持 Avro, BSON, CBOR, CSV, Smile, Properties, Protobuf, XML or YAML 等数据格式,甚至还支持大数据格式模块的设置。

  Jackson 的特点:

  高性能且稳定:低内存占用,对大小 JSON 串,大小对象的处理表现均很优秀
流行度高:是很多流行框架的默认选择
容易使用:提供高层次的 API,极大简化了使用
无需创建映射:内置了大量 Java 类型的映射类
灵活:内置大量配置项以满足不同业务需求

  
2、Jackson 配置

  Jackson 框架中包含了大量的配置让我们可以干预 Jackson 处理 JSON 的过程,这样就能满足各种个性要求。

  2.1、使用注解

  
和@JsonIgnore 作用相同;不同之处是 @JsonIgnoreProperties 是类级别的,并且可以同时指定多个属性。

  序列化和反序列化时

  
指定属性什么情况下会序列化

  JsonInclude.Include.ALWAYS 总是写入 JSON,默认
JsonInclude.Include.NON_DEFAULT 属性为默认值不序列化
JsonInclude.Include.NON_NULL 属性为 NULL不序列化
JsonInclude.Include.NON_EMPTY 属性为空("")或者为 NULL 都不序列化

  
getter方法上

  标注于 getter 方法上,类似 @JsonProperty,也可以解决 json 键名称和 Java POJO 属性名称不匹配的问题

  
setter方法上

  标注于 setter 方法上,类似 @JsonProperty,也可以解决 json 键名称和 Java POJO 属性名称不匹配的问题

  反序列化时

  


//设置日期格式,作用和 @JsonFormat 类似

 

  objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
//反序列化时,实体类中没有对应属性时是否抛出异常
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

  //指定属性什么情况下会序列化,作用和 @JsonInclude 类似

  objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);

  //字符串如果为 null 则输出 ""

  objectMapper.setSerializerFactory(objectMapper.getSerializerFactory().withSerializerModifier(new BeanSerializerModifier() {

   @Override

   public List BeanPropertyWriter changeProperties(SerializationConfig config, BeanDescription beanDesc, List BeanPropertyWriter beanProperties) {

   for (BeanPropertyWriter writer : beanProperties) {

   Class ? clazz = writer.getType().getRawClass();

   if (CharSequence.class.isAssignableFrom(clazz) Character.class.isAssignableFrom(clazz)) {

   writer.assignNullSerializer(new JsonSerializer Object () {

   @Override

   public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {

   jsonGenerator.writeString("");

   return beanProperties;

  ...

 

  3、具体使用

  3.1、引入依赖

  

 dependency 

 

   groupId com.fasterxml.jackson.core /groupId

   artifactId jackson-core /artifactId

   version 2.13.3 /version

   /dependency

   dependency

   groupId com.fasterxml.jackson.core /groupId

   artifactId jackson-databind /artifactId

   version 2.13.3 /version

   /dependency

   dependency

   groupId com.fasterxml.jackson.core /groupId

   artifactId jackson-annotations /artifactId

   version 2.13.3 /version

   /dependency

 

  如果使用了 Java8 的时间类型,还需引入:

  

 dependency 

 

   groupId com.fasterxml.jackson.datatype /groupId

   artifactId jackson-datatype-jsr310 /artifactId

   version 2.13.3 /version

   /dependency

 

  3.2、定义实体类

  

package com.abc.demo.json;

 

  import com.fasterxml.jackson.annotation.*;

  import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

  import com.fasterxml.jackson.databind.annotation.JsonSerialize;

  import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;

  import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;

  import lombok.Data;

  import lombok.ToString;

  import java.time.LocalDateTime;

  @Data

  @ToString

  public class Student {

   @JsonProperty("studentId")

   private Long id;

   @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")

   @JsonDeserialize(using = LocalDateTimeDeserializer.class)

   @JsonSerialize(using = LocalDateTimeSerializer.class)

   private LocalDateTime createTime;

   private String name;

   @JsonIgnore

   private String homeAddress;

  }

 

  3.3、序列化及反序列化

  

package com.abc.demo.json;

 

  import com.fasterxml.jackson.core.*;

  import com.fasterxml.jackson.core.type.TypeReference;

  import com.fasterxml.jackson.databind.*;

  import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

  import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;

  import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;

  import org.junit.Test;

  import org.slf4j.Logger;

  import org.slf4j.LoggerFactory;

  import java.io.ByteArrayOutputStream;

  import java.io.IOException;

  import java.time.LocalDateTime;

  import java.time.format.DateTimeFormatter;

  import java.util.ArrayList;

  import java.util.List;

  public class JacksonCase {

   private static final Logger logger = LoggerFactory.getLogger(JacksonCase.class);

   private ObjectMapper objectMapper = new ObjectMapper();

   * 序列化

   @Test

   public void serialize() throws IOException {

   Student student = new Student();

   student.setId(1L);

   student.setCreateTime(LocalDateTime.now());

   student.setName("小明");

   student.setHomeAddress("江苏");

   logger.info(objectMapper.writeValueAsString(student));

   //使用流式 API 生成 JSON,但只能序列化简单类型的 Java 对象

   ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

   JsonFactory jasonFactory = new JsonFactory();

   JsonGenerator generator = jasonFactory.createGenerator(byteArrayOutputStream);

   //为了支持 Java8 时间类,需做如下设置

   JavaTimeModule javaTimeModule = new JavaTimeModule();

   javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

   objectMapper.registerModule(javaTimeModule);

   generator.setCodec(objectMapper);

   generator.writeStartObject();

   generator.writeNumberField("id", 1L);

   generator.writeObjectField("createTime", LocalDateTime.now());

   generator.writeStringField("homeAddress", "江苏");

   generator.close();

   logger.info(byteArrayOutputStream.toString());

   * 反序列化

   @Test

   public void deserialize() throws IOException {

   Student student = new Student();

   student.setId(1L);

   student.setCreateTime(LocalDateTime.now());

   student.setName("小明");

   student.setHomeAddress("江苏");

   Student student2 = new Student();

   student2.setId(2L);

   student2.setCreateTime(LocalDateTime.now());

   student2.setName("小红");

   student2.setHomeAddress("上海");

   List Student list = new ArrayList ();

   list.add(student);

   list.add(student2);

   String json = objectMapper.writeValueAsString(student);

   String json2 = objectMapper.writeValueAsString(list);

   //反序列化为实体对象

   Student student3 = objectMapper.readValue(json, Student.class);

   logger.info(student3.toString());

   //反序列化为集合

   TypeReference List Student typeReference = new TypeReference List Student (){};

   List Student students = objectMapper.readValue(json2, typeReference);

   logger.info(students.toString());

   //使用树模型 API 解析 JSON

   JsonNode root = objectMapper.readTree(json2);

   JsonNode jsonNode = root.get(0);

   logger.info("第一条数据,{}", jsonNode.toString());

   logger.info("第一条数据,id={}", jsonNode.get("studentId").asLong());

   logger.info("第一条数据,name={}", jsonNode.get("name").asText());

   //...

   //使用流式 API 解析 JSON,使用 nextToken() 不停的往前遍历 JSON 数据,检查令牌类型并读取数据

   JsonFactory jsonFactory = new JsonFactory();

   JsonParser jsonParser = jsonFactory.createParser(json2);

   while (jsonParser.nextToken() != null) {

   logger.info(jsonParser.currentToken().toString());

   String key = jsonParser.getCurrentName();

   if (key != null) {

   jsonParser.nextToken();

   logger.info("key={},value={}", key, jsonParser.getText());

  }

 

  

  

  以上就是Java 操作 JSON 数据(4)()的详细内容,想要了解更多 Java 操作 JSON 数据(4)的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: