unity3d Unity将Firebase JSON反序列化为对象

wqlqzqxt  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(135)

我试图将从firebase数据库加载的一些json反序列化到一个自定义对象中,但我似乎不知道如何操作。
我有下面的类:

[Serializable]
public class MLResult : IEnumerable<List<int>>
{
    public List<List<int>> results;

    public MLResult(List<List<int>> results) {
        this.results = results;
    }

    // implementation of the IEnumerable interface
    public IEnumerator<List<int>> GetEnumerator() {
        return results.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator() {
        return GetEnumerator();
    }
}

我使用以下命令将MLResult对象保存到Firebase数据库:

public void SaveData() {    
    List<int> l1 = new List<int>{1,2,3,4,5};
    List<int> l2 = new List<int>{6,7,8,9,10};
    List<int> l3 = new List<int>{11,12,13,14,15};
    MLResult r = new MLResult(new List<List<int>>{l1,l2,l3});
    var json = JsonConvert.SerializeObject(r);
    var DBTask = DBreference.Child("users").SetRawJsonValueAsync(json);
}

然后,我尝试使用以下命令加载它:

public void LoadData()
{
    DBreference.Child("users").GetValueAsync().ContinueWith((DBTask => {
    if (DBTask.IsCompleted)
    {
        DataSnapshot snapshot = DBTask.Result;

        string data = snapshot.GetRawJsonValue();
        Debug.Log(data);

        MLResult res = JsonConvert.DeserializeObject<MLResult>(data);
        //test by printing out each number
        foreach (var item in res.results)
        {
            foreach (var x in item)
            {
                Debug.Log(x);
            }
        }
    }
}));
}

当我在data变量中打印原始json结果时,如下所示:[[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]
然而,下面的部分没有做任何事情,如果我在序列化之前在SaveData方法中使用相同的代码,它会打印所有的单个列表项。

foreach(var item in res.results) {
    foreach(var x in item) {
        Debug.Log(x);
    }
}
0yg35tkg

0yg35tkg1#

请修改MLResult类。不要试图继承任何集合类或接口,如IEnumerable、列表、数组等。这只会带来很多不同的bug

public class MLResult 
{
    public List<List<int>> results {get; init;}

    //or if you want it private
    [JsonProperty("results")]
    List<List<int>> results;

    public MLResult(List<List<int>> results) {
        this.results = results;
    }

    public IEnumerator<List<int>> GetResultsEnumerator()
    {
        return results.GetEnumerator();
    }

}

测试计数器

var enumerator = r.GetResultsEnumerator();
    while (enumerator.MoveNext())
    {
        var em = enumerator.Current.GetEnumerator();
        while (em.MoveNext())
        {
            var val = em.Current;
            Debug.Log(val);
        }
    }

相关问题