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

Android中使用GSON转换嵌套JSON对象至Java对象的类结构问题

嘿,我来帮你搞定这个嵌套JSON转Java实体类的问题!其实核心思路就是让Java类的结构和JSON的层级完全对应,我给你举个具体例子你一看就懂。

先假设你有这样一段嵌套结构的JSON:

{
  "user_id": 123,
  "username": "sofiaclover",
  "profile": {
    "real_name": "Sofia Clover",
    "age": 28,
    "contact": {
      "email": "sofia@example.com",
      "phone": "1234567890"
    }
  },
  "posts": [
    {
      "post_id": 456,
      "title": "Gson嵌套解析技巧"
    },
    {
      "post_id": 789,
      "title": "Android实体类设计"
    }
  ]
}
第一步:对应JSON层级创建Java实体类

我们从最外层到最内层,一步步构建对应的类:

1. 最外层实体类(比如命名为User.java)

这个类对应JSON的顶级结构,里面的字段要和JSON的顶级键完全匹配,嵌套的对象就用对应的类来定义:

public class User {
    private int user_id;
    private String username;
    // 对应嵌套的profile对象
    private Profile profile;
    // 对应posts数组,用List集合接收更灵活
    private List<Post> posts;

    // 重点:必须要有无参构造方法,Gson反射实例化需要它
    public User() {}

    // Getter和Setter方法(如果用Lombok的@Data注解可以自动生成,新手建议先手动写熟悉逻辑)
    public int getUser_id() { return user_id; }
    public void setUser_id(int user_id) { this.user_id = user_id; }
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    public Profile getProfile() { return profile; }
    public void setProfile(Profile profile) { this.profile = profile; }
    public List<Post> getPosts() { return posts; }
    public void setPosts(List<Post> posts) { this.posts = posts; }
}

2. 嵌套的Profile类

这个类对应JSON里的profile对象,里面再包含更深一层的contact对象:

// 注意:如果把这个类写在User类内部,必须声明为static,否则Gson无法解析
public static class Profile {
    private String real_name;
    private int age;
    private Contact contact;

    public Profile() {}

    // Getter和Setter
    public String getReal_name() { return real_name; }
    public void setReal_name(String real_name) { this.real_name = real_name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
    public Contact getContact() { return contact; }
    public void setContact(Contact contact) { this.contact = contact; }
}

3. 最深层的Contact类

对应JSON里的contact对象:

public static class Contact {
    private String email;
    private String phone;

    public Contact() {}

    // Getter和Setter
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
    public String getPhone() { return phone; }
    public void setPhone(String phone) { this.phone = phone; }
}

4. 数组对应的Post类

对应JSON里posts数组中的每个对象:

public static class Post {
    private int post_id;
    private String title;

    public Post() {}

    // Getter和Setter
    public int getPost_id() { return post_id; }
    public void setPost_id(int post_id) { this.post_id = post_id; }
    public String getTitle() { return title; }
    public void setTitle(String title) { this.title = title; }
}
第二步:用Gson解析的代码

现在你就可以用gson.fromJson()轻松解析了:

// 假设jsonStr是你的嵌套JSON字符串
String jsonStr = "你的JSON数据";
Gson gson = new Gson();
User user = gson.fromJson(jsonStr, User.class);

// 测试获取嵌套数据
String userEmail = user.getProfile().getContact().getEmail();
Log.d("Gson解析结果", "用户邮箱:" + userEmail);
几个关键注意点
  • 无参构造方法不能少:每个实体类都必须有,Gson通过反射创建对象时依赖它,不然会抛出解析异常。
  • 字段名匹配:Java字段名要和JSON的键名完全一致,如果想自定义Java字段名,可以用@SerializedName注解,比如:@SerializedName("user_id") private int userId;
  • 内部类要static:如果把嵌套类放在外部类里面,一定要加static修饰,否则非静态内部类需要依赖外部类实例,Gson无法单独解析它。
  • 数组对应集合:JSON数组优先对应Java的List类型,比数组更灵活,Gson会自动把数组元素转成集合中的对象。

不管你的JSON嵌套多少层,只要跟着这个“层级对应”的思路来创建实体类,就能顺利完成解析啦!

内容的提问来源于stack exchange,提问作者Sofia Clover

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:21:53