【问题标题】:Spring Boot - Json to Java Nested ObjectSpring Boot - Json 到 Java 嵌套对象
【发布时间】:2019-11-25 22:59:41
【问题描述】:

在我的 Spring Boot 应用程序中,我收到了这样一个带有扁平 json 的请求。

{
   "firstname" : "a",
   "lastname" : "b",
   "street": "non main st",
   "city": "NY"
}

我想像这样映射到 Java 对象。

class Person {
   String firstname;
   String lastname;
   Address address;
}

class Address {
    String street;
    String city;
}

这可能吗?


请注意,这是为我的 spring-boot 应用程序自动反序列化的。我不直接使用 Object Mapper。


控制器:

我的 REST 控制器没什么特别的。

@RestController
public class TestController{
    @GetMapping("/")
    public void justPrint(@RequestBody Person person){
        System.out.println(person);
    }
}

【问题讨论】:

  • @MichałZiober,恐怕不是。我已经更新了
  • 在幕后 ObjectMapper 无论如何都会被使用。 SpringBoot 反序列化 JSON 有效负载到 Java POJO 模型默认使用 Jackson 和它的类集。相关链接仅包含一个带有 ObjectMapper 的示例,可以通过复制粘贴来查看它。

标签: spring-boot jackson


【解决方案1】:

您可以尝试在您的Address 字段上使用@JsonUnwrapped

class Person {
   String firstname;
   String lastname;
   @JsonUnwrapped
   Address address;
}

更新:

虽然GET 也可以工作,但您应该在控制器中使用POSTPUT HTTP 方法映射,例如这里我要用@PostMapping:

@RestController
public class TestController{
    @PostMapping("/")
    public void justPrint(@RequestBody Person person){
        System.out.println(person);
    }
}

你应该在运行curl命令时发送数据:

curl -X POST -H "Content-Type: application/json" -d '{"firstname": "John", "lastname": "Smith", "street": "1st Str.", "city": "London"}' http://localhost:8080/

这里我假设您的服务在端口 8080 上运行。还有一件事,如果你没有为Person 类实现toString(),请写一个,因为只有类名会显示System.out.println

【讨论】:

  • 在不使用对象映射器的情况下是否可以在 Spring Boot 中工作?我不这么认为
  • 你不需要直接使用ObjectMapper。对于每个请求,Spring 将尝试找到合适的HttpMessageConverter 用于读取和写入 JSON 内容。在这种情况下,它将使用MappingJackson2HttpMessageConverter,它将为您完成所有序列化/反序列化。
  • 嗯,奇怪,因为这应该可以工作。您的控制器和接收此 JSON 有效负载的方法是如何定义的?你能用控制器代码更新你的问题吗
  • 我添加了控制器。
猜你喜欢
  • 2019-08-05
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 2020-07-01
  • 2016-03-01
  • 2019-03-27
相关资源
最近更新 更多