【问题标题】:Json to Dictionary C# UnityJson 到字典 C# Unity
【发布时间】:2021-05-23 11:50:47
【问题描述】:

我正在尝试将 JSONNode 更改为字典。我一直在寻找几个小时的解决方案。我知道 JsonUtilities 不适用于字典。我尝试的一切都给test4 = null,没有错误。

JSONNode test1 = JSON.Parse(customData);

//customData is :"{\"ItemClass\":\"S\",\"Type\":\"Band\",\"Stats\":[{\"HP\":\"100\",\"Atk\":\"50\",\"Def\":\"25\",\"Crit\":\"10\"}]}"

               
JSONArray test2 = test1["Stats"].AsArray;

               
JSONNode  test3 = test2[0];

TEST4 总是给我一个空值,我也尝试将 test3 更改为对象或字符串。以下是我尝试过的一些东西:

var test4 = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(test3);

var test4 = JsonConvert.DeserializeObject<List<Dictionary<string, int>>>(test3);

var test4 = JsonConvert.DeserializeObject<Dictionary<string, string>(test3);

var test4 = JsonConvert.DeserializeObject<Dictionary<string, int>(test3);

我正在尝试访问下图中的字典

https://i.stack.imgur.com/2JWLB.png

我确定我错过了一些超级简单的东西......

谢谢

【问题讨论】:

  • 这个答案准确地展示了如何将 json 移动到 Unity 中的 Dictionary stackoverflow.com/a/38535392/294884
  • 建议您为键和值创建列表,而不是直接序列化字典然后反序列化它。如果您想使用 JSON 中的字典,请将列表添加到空字典中。
  • @SeLeCtRa 我建议相反,而是直接使用DictionaryNewtonsoft .Net JSON 完全支持
  • 有没有办法在 test3 中找到字典(如图所示)?提供的链接中的示例使用类作为我的示例,实际上并没有类....也许我没有得到任何东西。

标签: c# json dictionary unity3d


【解决方案1】:

您宁愿使用正确的 json 数据结构表示(例如使用 json2csharp

[Serializable]
public class Root    
{
    public string ItemClass; 
    public string Type; 
    public List<Dictionary<string,string>>; 
}

然后做

var root = JsonConvert.DeserializeObject<Root>(jsonString); 

foreach(var stat in root.Stats)
{
    foreach(var kvp in stat)
    {
        Debug.Log($"{kvp.Key}:{kvp.Value}");
    } 
}

或者甚至不使用Dictionary,而是直接使用类似的类

[Serializable]
public class Stat
{
    public string HP; 
    public string Atk; 
    public string Def; 
    public string Crit; 
}

[Serializable]
public class Root
{
    public string ItemClass; 
    public string Type; 
    public List<Stat> Stats; 
}

那么你可以使用

var root = JsonConvert.DeserializeObject<Root>(jsonString); 

也可以内置

var root = JsonUtility.FromJson<Root>(jsonString);

然后做例如

foreach(var stat in root.Stats)
{
    Debug.Log($"HP:{stat.HP}, Ark:{stat.Atk}, Def:{stat.Def}, Crit:{stat.Crit}");
}

注意:在智能手机上输入,但我希望思路清晰

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 2021-09-16
    • 2019-10-05
    相关资源
    最近更新 更多