首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Spring Boot 接口一个 JSON 字符串用两个对象去接收,这能行吗?

Spring Boot 接口一个 JSON 字符串用两个对象去接收,这能行吗?

作者头像
IT_陈寒
发布2025-06-01 12:51:49
发布2025-06-01 12:51:49
2560
举报
文章被收录于专栏:开发经验开发经验

在 Spring Boot 开发过程中,我们常常需要处理前端传递过来的 JSON 数据。通常,我们会使用一个对象来接收这些数据,但有时我们可能会遇到一些特殊需求,比如将一个 JSON 字符串拆分到两个对象中。本文将探讨如何在 Spring Boot 中实现这一需求,并给出详细的代码示例和解释。

需求场景

假设我们有这样一个 JSON 字符串:

代码语言:javascript
复制
{
  "name": "John",
  "age": 30,
  "address": {
    "street": "123 Main St",
    "city": "Springfield"
  }
}

我们希望将这个 JSON 字符串中的 nameage 字段映射到一个对象 Person 中,而 address 字段映射到另一个对象 Address 中。这种需求在处理复杂的数据结构时并不少见。

解决方案

要实现这个功能,我们可以利用 Spring Boot 的 @RequestBody 注解和自定义的转换器。具体步骤如下:

  1. 创建两个接收 JSON 数据的类 PersonAddress
  2. 创建一个包含这两个对象的类 PersonWithAddress
  3. 自定义一个转换器,将 JSON 数据转换为 PersonWithAddress 对象。
  4. 在控制器中使用 @RequestBody 注解接收 JSON 数据。
Step 1: 创建 PersonAddress

首先,我们定义 PersonAddress 类:

代码语言:javascript
复制
public class Person {
    private String name;
    private int age;

    // Getters and Setters
}
代码语言:javascript
复制
public class Address {
    private String street;
    private String city;

    // Getters and Setters
}
Step 2: 创建 PersonWithAddress

接下来,我们定义一个包含 PersonAddress 对象的类:

代码语言:javascript
复制
public class PersonWithAddress {
    private Person person;
    private Address address;

    // Getters and Setters
}
Step 3: 自定义转换器

我们需要创建一个自定义转换器,将 JSON 数据转换为 PersonWithAddress 对象。这里我们使用 Jackson 的 ObjectMapper 进行转换:

代码语言:javascript
复制
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
public class PersonWithAddressConverter extends AbstractJackson2HttpMessageConverter {

    public PersonWithAddressConverter(ObjectMapper objectMapper) {
        super(objectMapper);
    }

    @Override
    protected boolean canRead(MediaType mediaType) {
        return true;
    }

    @Override
    protected boolean supports(Class<?> clazz) {
        return PersonWithAddress.class.equals(clazz);
    }

    @Override
    protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode rootNode = objectMapper.readTree(inputMessage.getBody());
        
        Person person = new Person();
        person.setName(rootNode.get("name").asText());
        person.setAge(rootNode.get("age").asInt());
        
        Address address = new Address();
        address.setStreet(rootNode.get("address").get("street").asText());
        address.setCity(rootNode.get("address").get("city").asText());
        
        PersonWithAddress personWithAddress = new PersonWithAddress();
        personWithAddress.setPerson(person);
        personWithAddress.setAddress(address);
        
        return personWithAddress;
    }
}
Step 4: 配置转换器

在 Spring Boot 中配置自定义的转换器:

代码语言:javascript
复制
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    private final PersonWithAddressConverter personWithAddressConverter;

    public WebConfig(PersonWithAddressConverter personWithAddressConverter) {
        this.personWithAddressConverter = personWithAddressConverter;
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(personWithAddressConverter);
    }
}
Step 5: 使用 @RequestBody 接收 JSON 数据

在控制器中接收 JSON 数据并处理:

代码语言:javascript
复制
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PersonController {

    @PostMapping("/person")
    public String createPerson(@RequestBody PersonWithAddress personWithAddress) {
        Person person = personWithAddress.getPerson();
        Address address = personWithAddress.getAddress();
        
        return "Received person: " + person.getName() + ", age: " + person.getAge() +
                " with address: " + address.getStreet() + ", " + address.getCity();
    }
}

结论

通过以上步骤,我们成功实现了将一个 JSON 字符串拆分到两个对象中的需求。在实际应用中,这种方法可以帮助我们更灵活地处理复杂的数据结构,使代码更加清晰和可维护。

这种方法不仅仅适用于简单的对象拆分,还可以扩展到更复杂的场景中。希望本文对你理解和实践 Spring Boot 中的 JSON 数据处理有所帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需求场景
  • 解决方案
    • Step 1: 创建 Person 和 Address 类
    • Step 2: 创建 PersonWithAddress 类
    • Step 3: 自定义转换器
    • Step 4: 配置转换器
    • Step 5: 使用 @RequestBody 接收 JSON 数据
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档