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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:06:50