找不到正确使用 JSON.NET 的方法

Can't find a way to use JSON.NET correctly

大家好,我尝试将 JSON.NET 与我的 json 文件一起使用。我想要一个对象集合来遍历并获取我想要的信息。

这是我的 json 文件 [编辑解释] 我有一个发射器集合(这里有 3 个,但我稍后会添加更多具有相同属性的发射器)。我需要能够遍历所有这些并知道它们是否已解锁。如果他们解锁了我需要把他们的属性用于一些计算。

{
  "Canon":{
    "Unlock": true,
    "FireRate": 0,
    "IsRotate": false,
    "RotateSpeed": 0,
    "NumberOfBullets": 0
  },
  "Rotator":{
    "Unlock": false,
    "FireRate": 0,
    "IsRotate": true,
    "RotateSpeed": 0,
    "NumberOfBullets": 0
  },
  "Back":{
    "Unlock": false,
    "FireRate": 0,
    "IsRotate": false,
    "RotateSpeed": 0,
    "NumberOfBullets": 0
  }
}

这是我的 类 映射

 [System.Serializable]
  public class Canon
    {
        public bool Unlock { get; set; }
        public int FireRate { get; set; }
        public bool IsRotate { get; set; }
        public int RotateSpeed { get; set; }
        public int NumberOfBullets { get; set; }
    }

 [System.Serializable]
    public class Rotator
    {
        public bool Unlock { get; set; }
        public int FireRate { get; set; }
        public bool IsRotate { get; set; }
        public int RotateSpeed { get; set; }
        public int NumberOfBullets { get; set; }
    }

 [System.Serializable]
    public class Back
    {
        public bool Unlock { get; set; }
        public int FireRate { get; set; }
        public bool IsRotate { get; set; }
        public int RotateSpeed { get; set; }
        public int NumberOfBullets { get; set; }
    }

 [System.Serializable]
    public class Launchers
    {
        public Canon Canon { get; set; }
        public Rotator Rotator { get; set; }
        public Back Back { get; set; }
    }

我曾尝试使用 JObject、JArray 等,但找不到能够执行类似操作的正确方法(在这种情况下,它根本不起作用 :( ))。

    void Start()
    {
        List<Launchers> jsonList = ReadJson(Application.dataPath + "/Resources/BDD/Launchers.json");

        if(jsonList != null){
            foreach (var item in jsonList)
            {
                if(item.Unlock){
                   // Do something
                }
            }
        }
    }
    static List<Launchers> ReadJson(string pathToJsonFile){
        if(File.Exists(pathToJsonFile)){
            JObject myjsonfile = JObject.Parse(File.ReadAllText(pathToJsonFile));
            List<Launchers> launcherList = JsonConvert.DeserializeObject<List<Launchers>>(myjsonfile .ToString());
            return launcherList;

        }else{
            return null;
        }
    }

很抱歉 post 但如果有人有一些 hints/solution,将不胜感激

好的,感谢@jonSkeet,我做了一些更改,现在一切正常!这是我为帮助和我有同样问题的人所做的更改。

首先更改了我的 json 文件以反映我真正想要的(例如:真实的启动器列表):

{
    "Launchers": [{
            "Name": "Canon",
            "Unlock": true,
            "FireRate": 0,
            "IsRotate": false,
            "RotateSpeed": 0,
            "NumberOfBullets": 0
        },
        {
            "Name": "Rotator",
            "Unlock": false,
            "FireRate": 0,
            "IsRotate": true,
            "RotateSpeed": 0,
            "NumberOfBullets": 0
        },
        {
            "Name": "Back",
            "Unlock": false,
            "FireRate": 0,
            "IsRotate": false,
            "RotateSpeed": 0,
            "NumberOfBullets": 0
        }
    ]
}

然后我将我的映射更改为:

  public class Launcher
    {
        public string Name { get; set; }
        public bool Unlock { get; set; }
        public int FireRate { get; set; }
        public bool IsRotate { get; set; }
        public int RotateSpeed { get; set; }
        public int NumberOfBullets { get; set; }
    }

    public class Listlaunchers
    {
        public IList<Launcher> Launchers { get; set; }
    }

最后是我的最后一段代码,可以按我的意愿使用它:

    void Start()
    {
        Listlaunchers jsonList = ReadJson(Application.dataPath + "/Resources/BDD/Launchers.json");

        if(jsonList != null){
            foreach (var item in jsonList.Launchers)
            {
                Debug.Log("LAUNCHER JSON => " + item.Name + " => " + item.Unlock);
            }
        }

    }

    static Listlaunchers ReadJson(string pathToJsonFile){
        if(File.Exists(pathToJsonFile)){
            JObject objectJson = JObject.Parse(File.ReadAllText(pathToJsonFile));
            Listlaunchers launcherList = JsonConvert.DeserializeObject<Listlaunchers>(objectJson.ToString());
            return launcherList;
        }else{
            return null;
        }
    }

谢谢你帮助我!