【问题标题】:handling nested JSON data for ListView处理 ListView 的嵌套 JSON 数据
【发布时间】:2019-02-28 00:08:07
【问题描述】:

我希望从 firebase 数据库访问嵌套的 JSON 数据以在 listView 中使用,这是我在整个应用程序中应用的内容,但现在无法访问具有动态属性的数据的子项。

从我的数据库导出我的 JSON 数据是;

{
    "T&G Canary Wharf" : {
        "Administrator" : {
            "1550633367665" : {
                "date" : "2019-02-12T12:00:00.000",
                "details" : "Full Day",
                "name" : "Edward Lawrence",
                "status" : "pending"
            },
            "1550633370715" : {
                "date" : "2019-02-13T12:00:00.000",
                "details" : "Full Day",
                "name" : "Edward Lawrence",
                "status" : false
            },
            "1550845072137" : {
                "date" : "2019-02-12T12:00:00.000",
                "details" : "Full Day",
                "name" : "Katie Prescott ",
                "status" : 1
            },
        },
        "Stylist" : {
            "1551222170677" : {
            "date" : "2019-02-19T12:00:00.000",
            "details" : "Full Day",
            "name" : "Stylist Stylist",
            "status" : "pending"
      }
    }
  }
}

对于应用程序的每个用户,group(在上面的示例中为 T&G Canary Wharf)将始终设置,但 subgroup(在示例中为管理员和造型师)对于管理员来说是动态的,这就是我所在的位置挣扎,

我的 firebase 数据库读取代码如下:

我正在使用 felgo(以前的 v-play),指向他们的 firebase 文档的链接是:

Felgo Firebase Plugin

App {

    property var adminModel: []
    property var groupName //the group name is assigned onLoggedIn, in this example group name === T&G Canary Wharf

    FirebaseDatabase {
        onLoggedIn: { 
        firebaseDb.getValue("groups" + "/" + groupName, {
                                orderByValue: true
                            }, function(success, key, value) {
                            if(success){
                            console.log("ADMIN MODEL: " + JSON.stringify(value))
                            adminModel = value // my array where I intend to push the data too                              
                            }
                        })
                    }
                }
            }

我一直在阅读;

access/process nested objects, arrays or JSON

(顺便说一句超级有用)特别是 如果属性名称是动态的并且我事先不知道它们怎么办?

我可以创建两个列表条目,AdministratorStylist(子组,但它的子键也是动态的(创建条目的时间,例如:“1550633367665”),我看不到更进一步?

要创建这个模型,我有代码:

ListPage {
    id: adminPage

    model: Object.keys(adminModel)

delegate: SwipeOptionsContainer {
    id: container

    rightOption:  SwipeButton {
        anchors.fill: parent
        backgroundColor: "red"
        icon: IconType.trash

        onClicked: {
            container.hideOptions()
        }
    }

    SimpleRow {
        id: userRow
        width: parent.width
        text: modelData
        }
    }
}

我的问题是

我如何创建一个listView,其代表是包含"status" : "pending" 的任何对象 - 在其他区域使用if (value[i].status === pending) { arr.push({...})} 循环完成,但subgroup (Stylist/Administrator) 未知,来自上面的数据库示例将是 2 个列表元素,但实际上将包含更多带有多个 subGroup 的元素。

【问题讨论】:

  • 不要描述您的代码,而是向我们展示minimal actual code that reproduces what you're struggling with。这使得更有可能有人能够并且将会提供帮助。请参阅how to create a minimal, complete, verifiable example 以获取更多有关此功能为何有用以及如何进一步增加机会的提示。
  • 另外请注意,如果您包含实际的 JSON(作为文本,没有屏幕截图),它会更容易提供帮助。您可以通过单击Firebase Database console 的溢出菜单 (⠇) 中的“导出 JSON”链接来获取此信息。
  • @FrankvanPuffelen 嗨弗兰克,感谢下面的反馈和回答,我已经用我的数据库的 JSON 提取更新了我的答案,还用我的代码从 firebase 读取以获得更好的上下文,如果你还需要什么,谢谢!
  • 我有点不知道您使用什么库来访问 Firebase。 firebaseDb.getValue(... 是什么?
  • 嗨@TrebuchetMS 我已经用ListPage 代码为我的Object.keys 更新了我的评论,抱歉没有说明,当我知道数据库的直接键时,我可以为模型创建数组,但它正在访问我正在努力解决的动态路径的孩子,如果您需要更多信息,请告诉我! (希望我已经给够了)谢谢

标签: javascript json firebase qml v-play


【解决方案1】:

从 FireBase 执行 getValue 之后,您似乎需要执行一些操作:

  1. 从您的组中检索子组。
  2. 遍历子组。
  3. 对于每个子组,检索时间条目。
  4. 根据状态是否为"pending"过滤时间条目。

您似乎已经使用Object.keys(adminModel) 完成了第 1 步。现在,我们将通过 for 循环(步骤 2 √)更进一步。

var subgroups = Object.keys(adminModel);
for (var i in subgroups) {
    var subgroup = adminModel[subgroups[i]];

    // ...
}

为方便起见,我们定义了subgroup_obj,它将存储子组的数据。例如。

"Stylist": {
      "1551222170677" : {
           "date" : "2019-02-19T12:00:00.000",
           "details" : "Full Day",
           "name" : "Stylist Stylist",
           "status" : "pending"
      }
}

然后我们继续第 3 步,再次使用 Object.keys() 检索时间条目,但这次是在子组上。

var timeEntries = Object.keys(subgroup);

由于Object.keys() 返回一个数组,我们可以通过使用filter() array method 过滤具有待处理状态的条目来完成步骤4。

var filteredEntries = timeEntries.filter(function(t) { return subgroup[t].status === "pending"; } );

使用较新版本的 JS,您可以使用 timeEntries.filter(t => subgroup[t].status === "pending"),但 Qt 似乎还没有完全支持。

就是这样。 filteredEntries 为我们提供了每个子组的时间条目数组(例如 [ "1551222170677" ])。

如果你想要完整的时间输入对象,你可以使用map array method来获取

var filteredEntries2 = filteredEntries.map(function(t) { return subgroup[t]; });

它为您提供了一个对象数组。所以像

[
{
    date: "2019-02-19T12:00:00.000"
    details: "Full Day"
    name: "Stylist Stylist"
    status: "pending"
}
]

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    当您从 Firebase 数据库获取数据时,您会返回包含 forEach 方法的 DataSnapshot,您可以使用该方法遍历所有子节点。

    所以要加载一个组并显示所有项目的名称:

    firebase.database().ref("group").once("value").then(function(snapshot) {
      snapshot.forEach(function(groupSnapshot) {
        groupSnapshot.forEach(function(subgroupSnapshot) {
          console.log(subgroupSnapshot.val().name);
        })
      })
    })
    

    【讨论】:

      猜你喜欢
      • 2013-11-23
      • 1970-01-01
      • 2022-07-13
      • 1970-01-01
      • 2018-02-04
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      相关资源
      最近更新 更多