如何使用 Jackson 项目在 Spring Boot 中管理 JSON 数据

x33g5p2x  于2022-09-28 转载在 Spring  
字(3.7k)|赞(0)|评价(0)|浏览(405)

在本教程中,我们将学习如何使用内置的 Jackson 提供程序在 Spring Boot 应用程序中生成和使用 JSON 数据

Jackson 项目为 XML 和 JSON 等标准格式提供一流的支持。 Spring Framework 和 Spring Boot 内置了对基于 Jackson 的 JSON 和 XML 序列化/反序列化的支持。

考虑以下 Spring Boot 控制器类:

@RestController
public class CustomerController {
  @Autowired CustomerRepository repository;

  @RequestMapping("/list")
  public List<Customer> findAll() {
    return repository.getData();
  }

  @RequestMapping("/one/{id}")
  public Customer findOne(@PathVariable int id) {
    return repository.getData().get(id);
  }
}

假设 Customer 对象是通过以下方式创建的:

@Component public class CustomerRepository {
  List < Customer > customerList = new ArrayList < Customer > ();
  @PostConstruct public void init() {
      try {
        customerList.add(new Customer(1, "frank"); customerList.add(new Customer(2, "john");
          }
          catch (ParseException e) {
            e.printStackTrace();
          }
        }
        public List < Customer > getData() {
          return customerList;
        }
      }

然后,当请求 URL http://localhost:8080/list 时,将返回以下 JSON 数据:

[      {         "id": 1,         "name": "frank"     },     {         "id": 2,         "name": "john"     }  ]

不需要添加任何 jackson-core、jackson-annotations 和 jackson-databind,因为它们的 jar 是由 Spring Boot 自动添加的:

jar tvf demo-rest-0.0.1-SNAPSHOT.jar    . . . .  1348389 Tue Aug 06 01:41:54 CEST 2019 BOOT-INF/lib/jackson-databind-2.9.9.3.jar  66519 Sat Jul 29 20:53:26 CEST 2017 BOOT-INF/lib/jackson-annotations-2.9.0.jar 325632 Wed May 15 19:58:38 CEST 2019 BOOT-INF/lib/jackson-core-2.9.9.jar  33429 Thu May 16 03:26:48 CEST 2019 BOOT-INF/lib/jackson-datatype-jdk8-2.9.9.jar 100674 Thu May 16 03:27:12 CEST 2019 BOOT-INF/lib/jackson-datatype-jsr310-2.9.9.jar   8645 Thu May 16 03:26:28 CEST 2019 BOOT-INF/lib/jackson-module-parameter-names-2.9.9.jar

使用Jackson注解

如前所述,如果您对默认的 Jackson 序列化/反序列化没问题,则无需添加任何额外的依赖项。另一方面,如果你想在你的代码中使用 Jackson 注释来编译应用程序,则需要添加一个 Jackson 依赖项。

让我们创建一个更复杂的 Customer 对象:

public class Customer {     @JsonIgnore     private int id;      @JsonProperty("customer_name")     private String name;      @JsonSerialize(using = CustomDateSerializer.class)     public Date birthDate;      public Customer(int id, String name, Date birthDate) {         this.id = id;         this.name = name;         this.birthDate = birthDate;     }     
// Getter/Setters omitted for brevity 
}

该类包含以下注释:

  • @com.fasterxml.jackson.annotation.JsonIgnore:此注解指示该属性将被基于自省的序列化和反序列化功能忽略。
  • @com.fasterxml.jackson.annotation.JsonProperty:此注解可用于在 JSON 对象中提供自定义名称字段名称
  • @com.fasterxml.jackson.databind.annotation.JsonSerialize:这个注解可以用来提供一个自定义的Java类来序列化JSON对象的内容。
public class CustomDateSerializer extends StdSerializer<Date> {
  private static SimpleDateFormat formatter = new SimpleDateFormat("EEEEE MMMMM yyyy");

  public CustomDateSerializer() {
    this(null);
  }

  public CustomDateSerializer(Class<Date> t) {
    super(t);
  }

  @Override
  public void serialize(Date value, JsonGenerator gen, SerializerProvider arg2)
      throws IOException, JsonProcessingException {
    gen.writeString(formatter.format(value));
  }
}

这一次,额外的 Date 字段将包含在 Customer 类的 Constructor 中:

@PostConstruct public void init() {
  try {
    customerList.add(new Customer(1, "frank", new SimpleDateFormat("dd/MM/yyyy").parse("17/10/1970")));
    customerList.add(new Customer(2, "john", new SimpleDateFormat("dd/MM/yyyy").parse("25/07/1980")));
  } catch (ParseException e) {
    e.printStackTrace();
  }
}

(http://localhost:8080/list) 的结果将是以下 JSON 数据:

[      {         "birthDate": "Saturday October 1970",         "customer_name": "frank"     },     {         "birthDate": "Friday July 1980",         "customer_name": "john"     }  ]

为了编译您的示例,您需要包含以下额外依赖项:

<?xml version="1.0" encoding="UTF-8"?><project>
   <dependency>
       	
      <groupId>com.fasterxml.jackson.core</groupId>
       	
      <artifactId>jackson-core</artifactId>
       	
      <version>2.9.8</version>
       
   </dependency>
    
</project>

就这样。此 Spring Boot Jackson 示例的源代码可在此处获得:https://github.com/fmarchioni/masterspringboot/tree/master/json/demo-jackson

相关文章