从Firebase数据库检索数据到嵌套字典

时间:2018-11-15 13:25:43

标签: json firebase dictionary unity3d firebase-realtime-database

尝试从Firebase数据库检索数据并将其移至统一字典时遇到很多问题。

所以我想这样做,只是一次检索数据,然后将所有数据放入字典中,问题是如果字典是嵌套字典,我找不到解决方法。

这是我的数据库的外观(简化):

    {"questions": {
    "group1": {
        "id_1": {
          "Question": "question one",
          "A": "answer1"
        },
        "id_2": {
          "Question": "question two",
          "A": "answer2"
        }
      }
  }
    }

因此,在我的代码中,我执行以下操作:

public void RetrievePreguntesJson()
{
    string group = "group1"
    questions_ref.Child(group).GetValueAsync().ContinueWith(task => {
        if (task.IsFaulted)
        {
            Debug.LogError("Error Getting Info from user database");
        }
        else if (task.IsCompleted)
        {
            DataSnapshot snapshot = task.Result;
            myDictionary = snapshot.Value as Dictionary<string, object>;
            dataReady();
        }
    });
}

所以问题是我无法获得任何价值。 我想做类似myDictionary["id_1"]["Question"]的事情,并获取值“问题一”。或myDictionary["id_1"].Question并获得值“问题一”。

我已经尝试了以下方法: -创建这样的班级问题:

public class Questions
{
    public string id;
    public string Question;
    public string Answer;

    public Questions(string id, string Question, string Answer)
    {
        this.id = id;
        this.Question = Question;
        this.Answer = Answer;
    }
}

并使用以下代码代替"userInfoDictionary = snapshot.Value as Dictionary<string, object>;"

使用:

Questions ClassObjectName = JsonUtility.FromJson<Questions>(snapshot.GetRawJsonValue());

但是它也不起作用。

也尝试过:

"userInfoDictionary = snapshot.Value as Dictionary<string, Dictionary<string, object>>;"

但是它也不起作用。

有人可以帮我吗?

“编辑”

这是我的json:

{"questions": {
    "group1": {
        "id_1": {
          "Question": "question one",
          "A": "answer1"
        },
        "id_2": {
          "Question": "question two",
          "A": "answer2"
        }
      }
  }
    }

这是对象:

[System.Serializable]
public class Group1
{
    public QuestionsId group1;
}
[System.Serializable]
public class QuestionsId
{
    public Questions id;
}
[System.Serializable]
public class Questions
{
    public string Question;
    public string A;
}

我正在使用以下方法反序列化Json:

Group1 ClassObjectName = JsonUtility.FromJson<Group1>(snapshot.GetRawJsonValue());

我希望能够得到一个调用像这样的值的结果: myDictionary["id_1"].Question myDictionary["id_1"]["Question"]

我现在正在使用对象和Json实用程序,但是如果仍然可以使用统一字典来获得我想要的结果,那对我来说也是可以的。例如:"userInfoDictionary = snapshot.Value as Dictionary<string, object>;"

有人知道如何帮助我吗?

1 个答案:

答案 0 :(得分:0)

如果有人遇到相同的问题。 我发现自己在做我一直在寻找的事情,那就是统一的JsonUtility无法做到,因为它只能与一个已知的键一起使用,因为您必须始终将对象作为统一的类来创建。 因此,例如,如果我的json具有“ id_3”键,则它将不起作用,因为我的对象只有“ id_1”和“ id_2”。能够创建不确定数量的Ids的唯一方法是将它们设置为数组(在这种情况下,我不希望这样做),因为这将使您将字典称为:myDictionary[0]["Question"] 但是无论如何,只要有人需要,Json就应该像这样与JsonUtility一起工作(将Ids设置为数组):

{"questions": {
    "group1": [
               {
                 "Question": "question one",
                 "A": "answer1"
               },
               {
                 "Question": "question two",
                 "A": "answer2"
               }
              ]
          }
 }

好吧,因为这不是我想要的,所以我发现最简单的方法是使用SimpleJson库,该库完全符合我的预期,并且超级易于使用,而无需创建自己的对象团结一致。 从firebase的快照中获取普通的Json文件:

{"questions": {
        "group1": {
            "id_1": {
              "Question": "question one",
              "A": "answer1"
            },
            "id_2": {
              "Question": "question two",
              "A": "answer2"
            }
          }
       }
     }

您只需执行以下操作:

var N = JSON.Parse(snapshot.GetRawJsonValue());
Debug.Log("N---> " + N["id_1"].ToString());

所以它完全符合我的预期。 这里的坏事是这是一个外部库,因此它可能会出现一些统一性的问题,例如尝试对这些数据使用syncVars。