使用Gson反序列化包含List的对象
嘿,这个问题我熟,用Gson处理这种嵌套了列表和多层对象的JSON其实很简单,咱们一步步来搞定它:
第一步:先修正JSON格式(重要!)
你提供的JSON用了单引号,而标准JSON要求必须用双引号,所以首先要把所有单引号替换成双引号。另外注意你的logoEmpresa数组看起来截断了,但这不影响实体类的定义和反序列化逻辑。
第二步:创建对应嵌套结构的Java实体类
根据JSON的层级结构,我们需要创建多个实体类来映射每个嵌套对象,字段名要和JSON里的键完全一致(或者用@SerializedName注解适配不同命名):
1. 最外层根对象(Root)
public class Root { private Empresa empresa; // Getters & Setters // 也可以用Lombok的@Data注解自动生成,省得写一堆get/set }
2. 企业主类(Empresa)
public class Empresa { private AreaAtuacao areaAtuacao; private String cnpjEmpresa; private boolean empresaAtivada; private Endereco endereco; private int idEmpresa; private List<Contato> listaContato; private List<HorarioEmpresa> listaHorario; private List<Integer> logoEmpresa; // 对应JSON里的整数数组 // Getters & Setters }
3. 业务领域类(AreaAtuacao)
public class AreaAtuacao { private String areaAtuacao; private int idAreaAtuacao; // Getters & Setters }
4. 地址类(Endereco)
public class Endereco { private String bairro; private String cep; private String cidade; private String complemento; private String estado; private int idEndereco; private String logradouro; private String numero; // Getters & Setters }
5. 联系人类(Contato)
public class Contato { private String contato; private int idContato; private String tipoContato; // Getters & Setters }
6. 星期类(DiaSemana)
public class DiaSemana { private String diaSemana; private int idDiaSemana; // Getters & Setters }
7. 营业时间类(HorarioEmpresa)
这里的时间字段是拆分的年/月/日/时/分/秒,推荐用Java 8的LocalDateTime来映射,不过需要Gson的扩展模块支持:
import java.time.LocalDateTime; public class HorarioEmpresa { private DiaSemana diaSemana; private LocalDateTime fimExpediente; private LocalDateTime fimIntervalo; private int idHorarioEmpresa; private LocalDateTime inicioExpediente; private LocalDateTime inicioIntervalo; // Getters & Setters }
第三步:配置Gson并执行反序列化
先添加必要依赖(Maven示例)
如果用LocalDateTime,需要引入Gson的Java时间扩展模块:
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> <!-- 用最新稳定版即可 --> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson-javatime</artifactId> <version>2.10.1</version> </dependency>
反序列化代码示例
import com.google.gson.Gson; import com.google.gson.GsonBuilder; public class EmpresaDeserialization { public static void main(String[] args) { // 替换成你修正后的JSON字符串 String json = "你的修正后JSON字符串"; // 配置Gson,注册JavaTimeModule以支持LocalDateTime Gson gson = new GsonBuilder() .registerModule(new com.google.gson.JavaTimeModule()) .create(); // 执行反序列化 Root root = gson.fromJson(json, Root.class); // 测试输出,验证结果 System.out.println("企业CNPJ: " + root.getEmpresa().getCnpjEmpresa()); System.out.println("第一个联系人: " + root.getEmpresa().getListaContato().get(0).getContato()); System.out.println("周一营业时间开始: " + root.getEmpresa().getListaHorario().get(0).getInicioExpediente()); } }
可选替代方案(不用JavaTimeModule)
如果你不想引入额外依赖,可以把HorarioEmpresa里的LocalDateTime换成自定义时间类:
public class CustomDateTime { private int year; private int month; private int dayOfMonth; private int hourOfDay; private int minute; private int second; // Getters & Setters }
然后修改HorarioEmpresa的字段类型为CustomDateTime即可,这样无需额外依赖就能完成反序列化。
小提示
- 如果Java字段名和JSON键名不一致,用
@SerializedName("json键名")注解来映射,比如@SerializedName("listaContato") private List<Contato> contacts; - 实体类可以用Lombok的
@Data、@NoArgsConstructor等注解简化代码,减少手动写get/set的麻烦。
内容的提问来源于stack exchange,提问作者Reinaldet
相关产品推荐
相关产品推荐

