我正在尝试制作一个具有每个级别获得的所有奖金特征的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一无所获
我缺少什么?
答案 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