【问题标题】:Xamarin.Forms: Unable to deserialise/receive JSON data from Firebase realitime databaseXamarin.Forms:无法从 Firebase 实时数据库反序列化/接收 JSON 数据
【发布时间】:2019-09-01 14:31:57
【问题描述】:

这是我的第一个堆栈溢出问题,如果格式错误,我很抱歉。我一直在尝试将 Xamarin.Forms 与 firebase 实时数据库结合使用,但无法正确接收数据。我不断收到以下异常。

(我不知道如何链接本地图像,所以这里是异常消息):

Unhandled Exception:

Firebase.Database.FirebaseException: Exception occured while processing the request.

Url: https://MY_DATABASE_LINK/users/user_name1/.json
Request Data: 
Response: {"age":"Age_Val1","fName":"First_Val1","lName":"Last_Val1"}

我正在将 Xamarin 与 NuGet 包 FirebaseDatabase.net 一起使用,并且一直在尝试遵循以下教程和在线问题:

https://www.c-sharpcorner.com/article/xamarin-forms-working-with-firebase-realtime-database-crud-operations/

https://forums.xamarin.com/discussion/80017/firebase-database-query

我已经尝试使用这两种技术并抛出相同的异常。似乎数据库正在向我发回格式为 JSON 的正确数据,但我的代码无法反序列化它。这是我的 JSON 数据库结构,以及我尝试运行的代码 -

FirebaseHelper.cs:

    public class FirebaseHelper
    {
        FirebaseClient firebase = new FirebaseClient("https://MY_DATABASE_LINK.firebaseio.com/");

        public async Task<List<Person>> GetAllPersons()
        {

            return (await firebase
              .Child("users")
              .Child("user_name1")
              .OnceAsync<Person>()).Select(item => new Person
              {
                  FName = item.Object.FName,
                  LName = item.Object.LName,
                  Age = item.Object.Age
              }).ToList();
            }

    }

Person.cs:

public class Person
    {
        public string FName { get; set; }
        public string LName { get; set; }
        public string Age { get; set; }
    }
JSON Database Structure:

{
  "users" : {
    "user_name1" : {
      "age" : "Age_Val1",
      "fName" : "First_Val1",
      "lName" : "Last_Val1"
    },
    "user_name2" : {
      "age" : "Age_Val2",
      "fName" : "First_Val2",
      "lName" : "Last_Val2"
    },
    "user_name3" : {
      "age" : "Age_Val3",
      "fName" : "First_Val3",
      "lName" : "Last_Val3"
    }
  }
}
Alt code tested:

List<Person> list_users = new List<Person>();
string[] ss = new string[] { "it", "succeeded" };
var items = await firebase
     .Child("users")
     .OrderByKey()
     .OnceAsync<Person>();

foreach (var item in items)
{
     Person user = new Person
         {
             FName = item.Object.FName,
             LName = item.Object.LName,
             Age = item.Object.Age
         };
     list_users.Add(user);
}

return list_users;

我希望异步 void 会从 JSON 对象“user_name1”中检索所有对象/数据,并将它们分别分配给“Person.cs”中的变量,然后创建第一个用户的单个长度列表。

我也只使用 Child("users") 执行此操作,它返回了一个更大的 JSON 对象,但仍然引发了异常(本来应该是长度为 3 的用户列表)

我只是想知道为什么会抛出这个异常?或者如果我试图错误地读取和分配数据,如果是这样,我应该如何正确地做到这一点?

【问题讨论】:

  • 您好!欢迎来到堆栈溢出!别担心,您的问题格式完美,设置得很好。我不是 firebase 专家,但有异常消息 “处理请求时发生异常。”“Url:MY_DATABASE_LINK/users/user_name1/.json(特别是 “/ .json" 部分)我可以告诉您,您以错误的方式/顺序请求数据。
  • 如何在视图模型中调用此方法?你能用断点调试它,然后看看你得到了什么?
  • 嗨 Wasif,我使用了断点,但它没有给我更多信息。因为它在一个大块中,所以它在该块中执行并失败。似乎它从未调用我的模型 Person 函数,因为它从未在 Person 类中显示断点。

标签: c# json firebase firebase-realtime-database xamarin.forms


【解决方案1】:

来自您的Person.cs

public class Person
{
    public string FName { get; set; }
    public string LName { get; set; }
    public string Age { get; set; }
}

那么FirebaseHelper.cs至少应该是这样的:

public class FirebaseHelper
   {
        FirebaseClient firebase = new FirebaseClient("https://MY_DATABASE_LINK.firebaseio.com/");

        public async Task<List<Person>> GetAllPersons()
        {

            return (await firebase
              .Child("<table_name>") // should only be your table name,here should be 'users'
              .OnceAsync<Person>()).Select(item => new Person
              {
                  FName = item.Object.FName,
                  LName = item.Object.LName,
                  Age = item.Object.Age
              }).ToList();
            }
}

最后,得到如下人员:

FirebaseHelper firebaseHelper = new FirebaseHelper(); 
var allPersons = await firebaseHelper.GetAllPersons(); 

如果有其他问题,可以显示firebase数据库的table_name截图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 2020-02-27
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多