【问题标题】:Import json not parsing the data导入json不解析数据
【发布时间】:2018-12-22 02:49:11
【问题描述】:

我正在尝试制作一个 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

【问题讨论】:

  • 尝试公开LevelBonus的成员,例如public int Power;
  • 很遗憾不起作用
  • 解析不正确这到底是什么意思?
  • 哦,是的,不准确,这意味着它不返回任何内容,也不会出错。
  • @Crocsx,你有没有尝试过 newtonsoft.json。

标签: c# json unity3d


【解决方案1】:

在加载 Json 时,我几乎总是做的从来不是手写它们。我创建了一个我想先在内存中写入的实例,而不是保存到 json - 以确保字段布局完全符合序列化程序的预期 - 编写一个有效的 json 很容易,但没有意义当映射到 C# 类时

在您的情况下,答案很简单。在 Json 结构中你有

{ field_name : field_value }

对。但是当它说“1”:值时,它永远不会反序列化,因为字段的名称是“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] 访问您的元素

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

【讨论】:

    【解决方案2】:

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

    无法评论,所以在回答中提及。

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

    public class Person
    {
       public string Name {get;set;}
    }
    

    【讨论】:

    • 是的,我想我需要一个自定义 JSON 库,因为 JsonUtility 很弱
    • @Crocsx 如果这是 Unity,那么使用 JSON.Net 可能会有问题。
    • @Dharmashree 如果您无法发表评论,那么您需要去获得所需的声誉才能这样做。请不要尝试滥用系统并发布答案。
    • 这个json不是数组
    猜你喜欢
    • 2015-07-26
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多