导入json不解析数据

时间:2018-12-22 02:49:12

标签: c# json unity3d

我正在尝试制作一个具有每个级别获得的所有奖金特征的json文件。

Json就是这样:

{
  "0": {
    "Armor": 1,
    "Strenght": 1,
    "Mana": 2,
    "Power": 1,
    "Health": 1
  },
  "1": {
    "Armor": 1,
    "Strenght": 1
  }
}

然后我叫装载机:

struct LevelBonus
{
    int Power;
    int Mana;
    int Strenght;
    int Armor;
    int Health;
}
Dictionary<string, LevelBonus> statsPerLevel;
statsPerLevel = FileLoaderManager.instance.LoadJSONData<Dictionary<string, LevelBonus>>("PlayerStats/level.json");

在其他地方

public T LoadJSONData<T>(string path)
{
    string filePath = Path.Combine(Application.streamingAssetsPath, path);
    if (File.Exists(filePath))
    {
        string dataAsJson = File.ReadAllText(filePath);
        T loadedData = JsonUtility.FromJson<T>(dataAsJson);
        return loadedData;
    }
    else
    {
        Debug.LogError("Cannot load game data!");
        return default(T);
    }
}

我的数据已加载,但未正确解析。基本上,没有错误,但是从读取文件直到

都没有返回数据
T loadedData = JsonUtility.FromJson<T>(dataAsJson);

我可以正确地以字符串形式读取数据。但是FromJson一无所获

我缺少什么?

编辑:https://answers.unity.com/questions/1583163/importing-data-from-json.html?childToView=1583169#comment-1583169

2 个答案:

答案 0 :(得分:0)

在加载Jsons时,我几乎总是做的事情从来都不是手工编写的。我先创建一个要在内存中写入的实例,然后保存到json-以确保字段布局与序列化程序期望的完全相同-易于编写有效的json,但没有任何意义映射到C#类时

对于您而言,答案很简单。在Json结构中

{ field_name : field_value }

对。但是当它说“ 1”:value时,它永远不会反序列化,因为字段名称是“ 1”,这在C#中不是有效的字段名称(必须以字母开头)。要反序列化的定义对象必须看起来像

class MyStats
{
 public int Armor;
 public int Strenght;
 public int Mana;
 public int Power;
 public int Health;
}

我认为这很糟糕,但是要反序列化您的示例,则需要像这样定义您的容器对象(这是无效的)

MyContainerObject类     {        公开MyStats 1; //错误:字段名无效!        公开MyStats 2; //错误:字段名无效!     }

由于Json有效,它不会返回错误,并且解析器仅跳过与您使用的类定义不匹配的字段。

要重新使用数组,您可以破解包装扩展名(如Dharmashree所建议的),这有点古怪(JsonUtility需要知道要反序列化的具体类,并且不能直接进入数组或列表)例如:

[
    {"a": 1 },
    {"b": 1 },
    {"c": 1 }
]

虽然是有效的json,但不会由JsonUtility(原始的匿名数组)进行解析,但这会

{
    "MyStats": [
      { "a": 1 },
      { "b": 2 },
      { "c": 1 }
    ]
}

您可以构造数据以将数组包含在容器对象中,因此可以将主对象定义为:

class MyContainerObject
{
   public MyStats[] stats; 
}

然后通过myList [index]

访问元素

好吧,我会再次强烈建议从编写代表您的结构的json开始,检查反序列化是否按预期工作,然后再手动编辑文件。

答案 1 :(得分:-1)

尝试使用Json数组。您可以在此处关注此示例。 https://www.newtonsoft.com/json/help/html/ToObjectComplex.htm

无法评论,因此在答案中提及。

NewtonSoft文档中使用的Person类应具有以下结构。

./dot-kids 1 3 | dot -Tx11