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
相关产品推荐
相关产品推荐

