You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot如何返回包含嵌套属性的序列化JSON

问题原因

Spring Boot 默认使用 Jackson 实现 Java 对象到 JSON 的序列化,Jackson 默认只能序列化 public 修饰的属性 或者 带有 public getter 方法的私有属性。你当前的 Cliente 类的 endereco 属性、Endereco 类的所有属性都是私有修饰,且没有提供对应的 public getter 方法,因此序列化时会被自动忽略。

解决步骤

  • 第一步:给 Cliente 类的所有属性添加 getter 方法
import java.util.UUID;

public class Cliente {
    
    private UUID id;
    private String nome;
    private Endereco endereco;
    
    public Cliente(String nome,String logradouro,String complemento,
            String bairro, String municipio, String UF, String CEP) {
        this.id=UUID.randomUUID();
        this.nome=nome;
        this.endereco=new Endereco(logradouro,complemento,bairro,
                municipio,UF,CEP);
    }

    // 新增getter方法
    public UUID getId() {
        return id;
    }

    public String getNome() {
        return nome;
    }

    public Endereco getEndereco() {
        return endereco;
    }
}
  • 第二步:给 Endereco 类的所有属性添加 getter 方法,同时修正拼写错误的属性名(原代码写的是minicipio,和构造方法参数名municipio不统一)
public class Endereco {
    
    private String logradouro;
    private String complemento;
    private String bairro;
    private String municipio; // 修正拼写错误
    private String UF;
    private String CEP;
    
    public Endereco(String logradouro, String complemento, String bairro, 
            String municipio, String UF, String CEP) {
        this.logradouro=logradouro;
        this.complemento=complemento;
        this.bairro=bairro;
        this.municipio=municipio; // 对应修正后的属性名
        this.UF=UF;
        this.CEP=CEP;
    }

    // 新增getter方法
    public String getLogradouro() {
        return logradouro;
    }

    public String getComplemento() {
        return complemento;
    }

    public String getBairro() {
        return bairro;
    }

    public String getMunicipio() {
        return municipio;
    }

    public String getUF() {
        return UF;
    }

    public String getCEP() {
        return CEP;
    }
}

优化建议

你当前接口用多个@RequestParam接收参数写法比较繁琐,更规范的写法是定义接收参数的DTO类,直接用@RequestBody接收JSON格式的请求体,代码可维护性更高:

// 新增接收参数的DTO
public class ClienteAddDTO {
    private String nome;
    private String logradouro;
    private String CEP;
    private String bairro;
    private String complemento;
    private String municipio;
    private String UF;
    // 此处省略getter、setter
}

// Controller调整写法
@PostMapping("/add")
public Cliente add(@RequestBody ClienteAddDTO dto) {
    return new Cliente(dto.getNome(),dto.getLogradouro(),dto.getComplemento(),
            dto.getBairro(),dto.getMunicipio(),dto.getUF(),dto.getCEP());
}

对应的Python请求也调整为发送JSON格式即可:

import requests

url = "http://localhost:8080/api/cliente/add"

payload = {'nome': 'Fabio',
'logradouro': 'Rua dos Bobos',
'CEP': '66666-666',
'bairro': '',
'complemento': '',
'municipio': 'Belem',
'UF': 'PA'}

response = requests.post(url, json=payload)
print(response.json())

内容的提问来源于stack exchange,提问作者Fabio Mendes Soares

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 03:09:03