【问题标题】:How to access Json data without unknown key? C# Unity3D [duplicate]如何在没有未知密钥的情况下访问 Json 数据? C# Unity3D [重复]
【发布时间】:2020-12-26 09:56:48
【问题描述】:

以下是我运行该代码时的结果。我的问题是如何在不使用“M4qRmfIqhKdy643Ujye”密钥(自动生成)的情况下访问/获取所有数据?我只想要 {assetname, id, ... etc }。我不想随身携带自动生成的 ID。

如果使用 JavaScript,我可以使用 object.values,但由于我使用的是 C#,所以我不知道如何获取数据。

{
    "-M4qRmfIqhKdy643Ujye": {
        "assetName": "avatar",
        "id": "-M4qRmfnFya7bC43Ujye",
        "imageName": "icon_avatar",
        "name": "Bob",
        "objName": "Bobby",
        "point": "-M4vZRY9vhKs65n5L_Gk",
        "versionNumber": "3"
    },
    "-M4qRmfIjjd5c643Ujye": {
        "assetName": "avatar",
        "id": "-M4qRmfnFya7bC43Ujye",
        "imageName": "icon_avatar",
        "name": "Bobfds",
        "objName": "Bobbydsf",
        "point": "-M4vZRY9vhKs65n5L_Gk",
        "versionNumber": "3"
    },
    "-M4qRmfIqhKdnjdsjye": {
        "assetName": "avatar",
        "id": "-M4qRmfnFya7bC43Ujye",
        "imageName": "icon_avatar",
        "name": "Bobfdsa",
        "objName": "Bobbyfc",
        "point": "-M4vZRY9vhKs65n5L_Gk",
        "versionNumber": "3"
    }

}

下面是我的下载器类中的一个功能

IEnumerator DownloadData(string dataPath, Action<string> callback){
    Debug.Log("dataPath=>"+dataPath);
    var token = LocalData.getAuth();
    Auth data = JsonUtility.FromJson<Auth>(token);
    var request = new 
    UnityWebRequest("https://test123.firebaseio.com/"+dataPath+".json? 
    auth="+data.idToken, "GET");
    request.downloadHandler = (DownloadHandler) new 
    DownloadHandlerBuffer();
    request.SetRequestHeader("Content-Type", "application/json");

    yield return request.SendWebRequest();

    if (request.isHttpError || request.isNetworkError)
    {
        Debug.Log(request.error);
        NotificationHelper.showOnePopup("Error \n"+request.error);
        callback(null);
    }
    else
    {
        string json = 
        FirebaseSetup.RESTToJsonConverter(request.downloadHandler.text);
        callback(json);
    }

下面是我的 FirebaseSetup 类

public static string FirebaseToJsonConverter(DataSnapshot snapshot){
    string data = "[";
    int i = 0;
    foreach(DataSnapshot s in snapshot.Children){
        data += s.GetRawJsonValue();
        i++;
        if(i != snapshot.ChildrenCount)
            data += ",";
    }
    data += "]";
    string JSONToParse = "{\"values\":" + data + "}";
    return JSONToParse;
}

public static string RESTToJsonConverter(string incoming_data)
{
    Debug.Log($"incoming_data:/n{incoming_data}");

    var startIndex = incoming_data.IndexOf('{', incoming_data.IndexOf('{') + 1);
    var endIndex = incoming_data.LastIndexOf('}') - 1;
    var json = incoming_data.Substring(startIndex, endIndex - startIndex);

    json = json.Trim();
    
    Debug.Log($"json:/n{json}");

    var data = JsonUtility.FromJson<string>(json);

    return data;
}

This is my error

【问题讨论】:

  • 首先,你知道如果复制key,只会保留最后一个属性值吗? {"foobar": "one", "foobar": "two", "foobar": "three"} 只给出:{"foobar": "three"} 因此,如果它们都有相同的密钥,-M4qRmfIqhKdy643Ujye 那么在将其解析为 JSON 之前,您必须以某种方式使用原始 JSON 文本重新映射密钥。
  • @Wyck 可能只是示例数据。如果不是,那么您不能使用 DOM,但您仍然可以使用 JsonReader 流式传输元素
  • @Wyck 对不起,实际上密钥不重复。我复制粘贴但忘记更改它的值。

标签: c# json unity3d scripting


【解决方案1】:

获取每个自动生成键的值的一种方法是将其转换为Dictionary&lt;string, Data&gt;。当您将其转换为字典时,您可以忽略键并只取值以在列表中执行您需要的操作。

例如,举例

public class Data
{
    public string assetName { get; set; }
    public string id { get; set; }
    public string imageName { get; set; }
    public string name { get; set; }
    public string objName { get; set; }
    public string point { get; set; }
    public string versionNumber { get; set; }
}

// in your main,
var obj = JsonConvert.DeserializeObject<Dictionary<string, Data>>(json);
List<Data> allData = obj.Select(x => x.Value).ToList();

allData 将拥有所有对象的列表。您可以使用 Linq 访问每个对象并获取所需的属性。

【讨论】:

    猜你喜欢
    • 2020-12-25
    • 2012-09-02
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 2023-04-02
    • 1970-01-01
    • 2013-01-03
    相关资源
    最近更新 更多