从 Firebase 数据快照获取 JSON 键值

Posted

技术标签:

【中文标题】从 Firebase 数据快照获取 JSON 键值【英文标题】:Getting JSON Key Value from Firebase Datasnapshot 【发布时间】:2018-07-10 05:50:23 【问题描述】:

与此同时,我正在使用 Firebase 开发 Flutter 应用程序,这确实很有趣,当然还有一些麻烦需要克服......

我设置了一个 Firebase 数据存储,并通过 firebase_database 插件获得了如下返回的 DataSnapshot:

FirebaseDatabase.instance.reference().child('users')
  .orderByChild('emailAddress')
  .equalTo('wonderjimmy@gmail.com').once()
  .then((onValue) 
   Map data = onValue.value;
  );

我使用一个 Map 对象来保存这个 JSON。一个愚蠢的问题:如果我只想得到值“-L474-TYYYGPvCChlZCS”,我该怎么办?

【问题讨论】:

存在 Firestore 未公开文档 ID 的问题。它是通过暴露路径来修复的。不确定您是否可以使用它,或者是否已经有更好的修复方法。参考:github.com/flutter/plugins/pull/244 既然可以读取所有值,为什么还要读取密钥本身? 因为我需要替换键下的值。其实拿到全集是没有问题的,我只是想知道如何正确解析返回的结果。 You do not need to mark questions as "SOLVED" via editing the title,或posting updates/thanks in posts。只需添加您自己的答案,如果此处的其中一个答案没有为您提供解决方案,则标记为已接受。任何额外的东西都可能被视为未来访客的噪音。请参阅:Can I answer my own question?。 【参考方案1】:

这对我有用:

.then(res => 
      // console.log(res)
      const data = res.data
      // extracting firebase ids for manipulating existing notes
      for (let key in data) 
        const item = data[key]
        item.id = key
        console.log(item.id)
      

【讨论】:

【参考方案2】:

要从 DataSnapshot 访问密钥,只需使用 snapshot.key,您将在您的案例用户中拥有该项目的相对密钥

 .then((onValue) 
   onValue.map(data => 
      var key = data.key
    )
 );

或者只是使用里面的firebase文档中给出的然后

.then(function(snapshot) 
    snapshot.forEach(function(childSnapshot) 
      var key = childSnapshot.key; // you will get your key here
  );
);

【讨论】:

是的,这正是我所看到的。那么如何才能在“用户”下获得值“-L474-TYYYGPvCChlZCS”? 在你得到地图内的快照后,你得到的快照对吗? 是的,或者任何更聪明的方法;) 你是这样拿到钥匙的吗?我想这就是我知道的方式 这个答案使用 javascript 语法。 Flutter 使用 Dart,代码看起来应该不一样。【参考方案3】:

你可以通过snapshot.key获取key,你可以在这里找到它的参考:

snapshot.forEach(function(childSnapshot) 
  var childKey = childSnapshot.key;
  var childData = childSnapshot.val();
  // ...
);

https://firebase.google.com/docs/database/web/lists-of-data#listen_for_value_events

【讨论】:

感谢您的回复,但如果使用 snapshot.key,返回值将是“users”。 根据您的查询更新了响应,快照上有一个 forEach 方法使用 key 和 val() 道具迭代 childSnapshots 谢谢亚历克斯,今晚让我试试。顺便说一句,我想要做的是获取子密钥然后将更新的 JSON 设置回原始位置,这样做的最佳实践是什么?迭代快照不可避免吗? 当您使用返回列表或 null 的条件请求数据库快照时,您必须验证它是否存在(不为 null),将其存储为您认为合适的位置以供进一步使用,然后迭代孩子们和/或选择第一场比赛 这个答案使用 JavaScript 语法。 Flutter 使用 Dart,代码应该看起来不一样。

以上是关于从 Firebase 数据快照获取 JSON 键值的主要内容,如果未能解决你的问题,请参考以下文章

Dart:从 Firebase 快照中解码 Json

如何快速从 firebase 获取用户的特定数据?

使用 swiftyJSON/swift 从 Firebase 解析排行榜数据

无法从 Android 上 Unity 中的 Firebase 快照获取“空”值

Firebase 实时数据库使快照更有价值

Firebase JavaScript 快照获取值