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)
通配符(“bucketa/bucketb/bucketc/*/*”)不像 Firebase 中那样存在,因此,如果您对数据结构没有影响,则只能从根目录“立即下载完整的数据树”桶a/桶b/桶等”。问题是,对于 firebase-database-dotnet,该树的“子项”(someguidtypekey/anotherguidtypekey)将显示为对象的属性,其中 GUIDkey 作为属性名称 - 这意味着您需要在编译时知道 guidkey为了这个工作。然而,考虑到该方法在底层使用 JSON.net,并且该库也支持反序列化为字典而不是对象,因此以下方法实际上可能有效:
\n\nawait firebase.Child("bucketa/bucketb/bucketc").OnceAsync<Dictiona\xe2\x80\x8c\xe2\x80\x8bry<string, Dictionary<string, RealCl\xe2\x80\x8c\xe2\x80\x8bass>>>();\nRun Code Online (Sandbox Code Playgroud)\n\n另外,如果只有一个查询,则使用 HttpClient“手动”执行此操作相当容易,或者使用 FireSharp(另一个 FB .net 库,https://github.com/ziyasal/FireSharp),它可以让您轻松直接访问“原始”返回的 JSON,如下所示:
\n\nFirebaseResponse response = await client.GetAsync("bucketa/bucketb/bucketc");\nvar myJson = response.Body;\nRun 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\nawait firebase.Child("bucketa/bucketb/bucketc").OnceAsync<Dictiona\xe2\x80\x8c\xe2\x80\x8bry<string, RealCl\xe2\x80\x8c\xe2\x80\x8bass>>();\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
4849 次 |
| 最近记录: |