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

如何在Java中用Gson反序列化含动态键的Firebase JSON对象

解决Firebase动态ID键的Gson反序列化问题

这个场景我太熟悉了!Firebase实时数据库的这种动态生成的ID键,确实会让常规的实体类反序列化失效——因为Gson不知道怎么处理那些不固定的键名。不过别担心,用Map来对应这些动态键值对就能轻松搞定!

核心思路

你的JSON结构里,compliant -> emails是一个键为动态Firebase ID、值为Email对象的映射集合,而不是数组。所以我们不能用List<Email>来接收,而是要用Map<String, Email>来匹配这种键值对结构。

具体实现步骤

  1. 创建顶层响应类
    首先需要一个类来匹配整个JSON的层级结构,把compliant和emails都包裹进去:

    package tv.zoome.integration.data;
    
    import com.google.gson.annotations.Expose;
    import com.google.gson.annotations.SerializedName;
    import java.util.Map;
    
    public class CompliantResponse {
        @SerializedName("compliant")
        @Expose
        private CompliantData compliant;
    
        public CompliantData getCompliant() {
            return compliant;
        }
    
        public void setCompliant(CompliantData compliant) {
            this.compliant = compliant;
        }
    
        // 内部类对应compliant下的子结构
        public static class CompliantData {
            @SerializedName("emails")
            @Expose
            private Map<String, Email> emails; // 用Map接收动态键值对
    
            public Map<String, Email> getEmails() {
                return emails;
            }
    
            public void setEmails(Map<String, Email> emails) {
                this.emails = emails;
            }
        }
    }
    
  2. 保留原Email实体类
    你之前写的Email类完全没问题,不需要做任何修改:

    package tv.zoome.integration.data;
    
    import com.google.gson.annotations.Expose;
    import com.google.gson.annotations.SerializedName;
    
    public class Email {
        @SerializedName("date")
        @Expose
        private String date;
        @SerializedName("email")
        @Expose
        private String email;
        @SerializedName("messageId")
        @Expose
        private String messageId;
        @SerializedName("notificationType")
        @Expose
        private String notificationType;
    
        // Getter和Setter方法保持不变
        public String getDate() { return date; }
        public void setDate(String date) { this.date = date; }
        public String getEmail() { return email; }
        public void setEmail(String email) { this.email = email; }
        public String getMessageId() { return messageId; }
        public void setMessageId(String messageId) { this.messageId = messageId; }
        public String getNotificationType() { return notificationType; }
        public void setNotificationType(String notificationType) { this.notificationType = notificationType; }
    }
    
  3. 执行反序列化
    现在就可以用Gson正常反序列化了,还能轻松拿到动态的Firebase ID:

    import com.google.gson.Gson;
    
    public class DeserializeDemo {
        public static void main(String[] args) {
            // 替换成你的实际JSON字符串
            String json = "{\"compliant\":{\"emails\":{\"-LCxUVIOiLT4TUM4Os3U\":{\"date\":\"2018-05-19T20:35:23.483Z\",\"email\":\"test@hotmail.com\",\"messageId\":\"d39126a2-29b0-5702-b0a5-75d8a57b0a1d\",\"notificationType\":\"Complaint\"},\"-LCxUVMI85eea0kISlc5\":{\"date\":\"2018-05-19T12:00:10.527Z\",\"email\":\"test2@hotmail.com\",\"messageId\":\"5b2ee1af-87c0-5aa3-ace3-b2d593ca7cb3\",\"notificationType\":\"Complaint\"}}}}";
    
            Gson gson = new Gson();
            CompliantResponse response = gson.fromJson(json, CompliantResponse.class);
    
            // 遍历Map获取所有Email数据和对应的Firebase ID
            for (Map.Entry<String, Email> entry : response.getCompliant().getEmails().entrySet()) {
                String firebaseId = entry.getKey();
                Email email = entry.getValue();
    
                System.out.println("Firebase ID: " + firebaseId);
                System.out.println("收件邮箱: " + email.getEmail());
                System.out.println("投诉时间: " + email.getDate());
                System.out.println("通知类型: " + email.getNotificationType());
                System.out.println("------------------------");
            }
        }
    }
    

为什么这样能行?

Gson会自动识别Map<String, Email>的结构,把emails对象里的每个动态ID作为Map的键,对应的JSON对象反序列化为Email实例作为Map的值,完美适配Firebase这种动态键的存储格式。

内容的提问来源于stack exchange,提问作者Vitor Darela

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:15:56