c#通过FirebaseDatabase.net查询Firebase数据的路径

gan*_*ers 8 c# firebase asp.net-core-mvc firebase-realtime-database asp.net-core

我无法弄清楚如何查询第三方数据.这是它的结构

/ bucketa/bucketb/bucketc/someguidtypekey/anotherguidtypekey /(我想在这里映射的字段)

我试过这个:

var stats = await firebase.Child("bucketa/bucketb/bucketc").OnceAsync<WrapperClass>();
Run Code Online (Sandbox Code Playgroud)

WrapperClassKey/Object组合在哪里,那么THAT对象是另一个Key/Object组合,然后该对象就是实际的类.

public class WrapperClass
{
    public string Key { get; set; }
    public WrapperClass2 Stats { get; set; }
}

public class WrapperClass2
{
    public string Key { get; set; }
    public RealClass Stats { get; set; }
}

public class RealClass
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
    public string Field3 { get; set; }
    public string Field4 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

var stats = await firebase.Child("bucketa/bucketb/bucketc/*/*").OnceAsync<RealClass>();
Run Code Online (Sandbox Code Playgroud)

但那只是返回了一个对象类型的字符串.

任何人都可以帮忙吗?

这是C#,使用FirebaseDatabase.net

编辑:

好的,现在我们越来越近了.实施@ElmarJensen修复(来自他的一条评论):

...OnceAsync<Dictionary<string, Dictionary<string, RealClass>>>();
Run Code Online (Sandbox Code Playgroud)

我现在收到错误:

将值True转换为类型'RealClass'时出错

在错误,它说,它正试图转换RealClass.property1这里property1是类型的bool.

为什么要尝试将其转换property1为我的RealClass对象类型而不是父对象?这个结构对我来说很有意义.在异常中,"responseData"属性具有我期望的正确JSON格式的所有记录,因此不确定这里发生了什么.

编辑2: 这是实际的数据格式:

{
    "0M6bRFLLokR6sIJAcKFN6y91NXB3": {
        "-KYdDf62eQUMGb-ov737": {
            "somethingBoolean":true,
            "asdf":"Joe User",
            "oasdfasdfsad": {
                "firstName":"asdf",
                "lastName":"asdfasdf",
                "tasdfme":"Wasdfh",
                "teasdfore":6,
                "teaasdfme":"SDFO"
            },
            "fasdfewaef":0,
            "startedAt":1.481381640492956E9,
            "updatedAt":1.481381687802693E9,
            "wfefeaefw":"182",
            "asdf": {
                "firstName":"asdf",
                "lastName":"asdf",
                "asdf":"asdfasdfasdf",
                "teamScore":0,
                "asefeawfawef":"DFDFSWEF"
            },
            "aefawefawefawefawef":0
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Elm*_*sen 4

通配符(“bucketa/bucketb/bucketc/*/*”)不像 Firebase 中那样存在,因此,如果您对数据结构没有影响,则只能从根目录“立即下载完整的数据树”桶a/桶b/桶等”。问题是,对于 firebase-database-dotnet,该树的“子项”(someguidtypekey/anotherguidtypekey)将显示为对象的属性,其中 GUIDkey 作为属性名称 - 这意味着您需要在编译时知道 guidkey为了这个工作。然而,考虑到该方法在底层使用 JSON.net,并且该库也支持反序列化为字典而不是对象,因此以下方法实际上可能有效:

\n\n
await firebase.Child("bucketa/bucketb/bucketc").OnceAsync<Dictiona\xe2\x80\x8c\xe2\x80\x8bry<string, Dictionary<string, RealCl\xe2\x80\x8c\xe2\x80\x8bass>>>();\n
Run Code Online (Sandbox Code Playgroud)\n\n

另外,如果只有一个查询,则使用 HttpClient“手动”执行此操作相当容易,或者使用 FireSharp(另一个 FB .net 库,https://github.com/ziyasal/FireSharp),它可以让您轻松直接访问“原始”返回的 JSON,如下所示:

\n\n
FirebaseResponse response = await client.GetAsync("bucketa/bucketb/bucketc");\nvar myJson = response.Body;\n
Run Code Online (Sandbox Code Playgroud)\n\n

之后,您可以轻松地迭代返回的 json 对象的属性(例如Iterating over JSON object in C#)。

\n\n

当然,如果您可以直接控制数据结构,建议将其进一步扁平化(请参阅https://firebase.google.com/docs/database/android/structural-data)。

\n\n

我不完全确定“但这只是返回了对象类型的字符串”是什么意思。.OnceAsync<RealClass>();将返回 FirebaseObject 类型的对象集合(原始对象作为其 Object 属性公开) - 绝不是 String。

\n\n

回复更新

\n\n

听起来好像您的查询比我从您的数据描述中假设的更深一层。这行得通吗?

\n\n
await firebase.Child("bucketa/bucketb/bucketc").OnceAsync<Dictiona\xe2\x80\x8c\xe2\x80\x8bry<string, RealCl\xe2\x80\x8c\xe2\x80\x8bass>>();\n
Run Code Online (Sandbox Code Playgroud)\n

  • 对代码做了一个小改动 -&gt; 代码应该是 `await firebase.Child("bucketa/bucketb/bucketc").OnceAsync&lt;Dictiona‌​ry&lt;string, Dictionary&lt;string, RealCl‌​ass&gt;&gt;&gt;();` (2认同)