【问题标题】:what should be the design of model for this json data?这个json数据的模型设计应该是什么?
【发布时间】:2017-11-09 12:56:29
【问题描述】:

我正在尝试解析来自 firebase 节点的数据,其中包含此 json 值 here is pic of json of node

我创建的相应数据模型是这样的

public class Extreme {

    @SerializedName("metaData")
    public ThreadModel.MetaData metaData;
    @SerializedName("users")
    public List<Users> usersList;
    @SerializedName("messages")
    public List<MessagesTwo> messagesList;


    public static class MetaData{
        @SerializedName("createBy")
        public String createBy;
        @SerializedName("createdAt")
        public Long createdAt;
        @SerializedName("name")
        public String name;
        @SerializedName("type")
        public String type;
        @SerializedName("threadPic")
        public String threadPic;
    }

    public static class Users{
        public String key;
        public boolean value;
    }
}   

但是当我尝试解析来自 firebase 数据库快照的数据时,它只将元数据的值解析为模型,所有其他事情都被忽略了。我只想知道对应的模型应该是什么样子。它经常发生在我身上,这让我把这个问题放在堆栈溢出上。对不起,如果这个问题有任何重复..

【问题讨论】:

  • 它解析了元数据,但没有解析消息和用户,对吗?
  • 该图有点晦涩难懂,但似乎“用户”是具有两个布尔变量而不是列表的模型。你能提供一个实际的 JSON 字符串示例来检查吗?
  • @PeterHadda 元数据仅使用上述模型进行解析。 userList 和 messageList 保持为空,我相信实际 json 中的列表
  • @PeterHaddad 你建议添加相应的注释,这不是我的朋友的问题,我已经用 SerializedName 定义了那些。如果您仔细查看“消息”和“用户”节点包含记录(节点)列表,我将这些节点定义为 POJO 中的列表,这给我带来了麻烦。我想我应该按照其他答案中的建议尝试使用地图。
  • 如果您再次阅读我的回答,您会看到 firebase 内置了序列化功能,如果您有不同的名称作为字段,则属性名称将在 firebase 中使用,这就是用户和消息数据的原因没有出现。变量名metaData 与数据库中的相同,但userslistmessagelists 不同。因此,要么将他们的名称更改为数据库中的名称(usersmessages),您的数据就会出现,或者在括号内添加带有相应数据库名称的属性名称。将用户列表更改为users,它将解析值以建模@JOt

标签: android firebase firebase-realtime-database gson


【解决方案1】:

模型应该是这样的:

public class Extreme {

    @SerializedName("metaData")
    public ThreadModel.MetaData metaData;
    @SerializedName("users")
    public Map<String,Boolean> usersList;
    @SerializedName("messages")
    public Map<String,Message> messagesList;

    public static class Message {
      private String id;
      private boolean seen;
      private String text;
      private long timeStamp;
      private String type;
}

你可以把你想要的名字放到 Message 里面的属性中,但是如果你这样做了,那么使用@SerializeName

不要忘记 getter 和 setter,否则不要公开属性。

使用 Map 的主要原因是因为键似乎是随机的。因此,您不能使用已定义的属性。

奖励点:如果属性的名称与 json 模型不同,您真的需要 @SerializedName。

【讨论】:

  • @Leondro Ocampo,感谢您的回复,我发现问题已经根据答案进行了一些更改并且它正在工作。非常感谢
  • 不客气。请记住,一些 cmets 说您应该为 Firebase 使用 PropertyName 而不是 SerializedName。也许这个链接可能会有所帮助:stackoverflow.com/questions/40690641/…
猜你喜欢
  • 2012-05-05
  • 2021-12-12
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多