不能反序列化当前JSON错误

问题描述 投票:0回答:2

这是我目前使用newtonsoft.json反序列化的代码。

    Crop[] crops = JsonConvert.DeserializeObject<Crop[]>(Globals.cropInfoJson.text);
    foreach(Crop crop in crops)
    {
        Debug.Log(crop.name);

        if (crop.name == type.ToString())
        {
            currentStage = crop.currentStage;
            maxStage = crop.maxStage;
            currentLifeTime = crop.currentLifeTime;
            nutritionalValue = crop.nutritionalValue;
            timeToGrow = crop.timeToGrow;
        }
    }


[System.Serializable]
public class Crop
{
    public string name;
    public float currentStage;
    public float maxStage;
    public float currentLifeTime;
    public float nutritionalValue;
    public float timeToGrow;
}

这是我的json。

{
    "corn": {
        "name": "corn",
        "currentStage": 1,
        "maxStage": 3,
        "currentLifeTime": 0,
        "nutritionalValue": 3,
        "timeToGrow": 360
    },
    "carrots": {
        "name": "carrots",
        "currentStage": 1,
        "maxStage": 3,
        "currentLifeTime": 0,
        "nutritionalValue": 3,
        "timeToGrow": 360
    }
 }

我得到的错误是:无法将当前JSON对象(例如{"name": "value"})反序列化为'Crop[]'类型,因为该类型需要一个JSON数组(例如[1,2,3])才能正确反序列化。

任何帮助都是非常感激的

c# unity3d json.net
2个回答
1
投票

你的JSON应该像下面这样

[
  {
    "name": "corn",
    "currentStage": 1,
    "maxStage": 3,
    "currentLifeTime": 0,
    "nutritionalValue": 3,
    "timeToGrow": 360
  },
  {
    "name": "carrots",
    "currentStage": 1,
    "maxStage": 3,
    "currentLifeTime": 0,
    "nutritionalValue": 3,
    "timeToGrow": 360
  }
]

玉米和胡萝卜都是数组项目,同时,你的类应该像下面这样。

public class Crop
{
    public string name { get; set; }

    public float currentStage { get; set; }

    public float maxStage { get; set; }

    public float currentLifeTime { get; set; }

    public float nutritionalValue { get; set; }

    public float timeToGrow { get; set; }
}

0
投票

你的Crop类应该是这样的。

    public class Crop
    {
        public CropInfo corn { get; set; }

        public CropInfo carrots { get; set; }
    }

    public class CropInfo
    {
        public string name { get; set; }

        public float currentStage { get; set; }

        public float maxStage { get; set; }

        public float currentLifeTime { get; set; }

        public float nutritionalValue { get; set; }

        public float timeToGrow { get; set; }
    }

然后

Crop crop = JsonConvert.DeserializeObject<Crop>(Globals.cropInfoJson.text);

0
投票

你当前的JSON是一个JsonObject,而不是JsonArray,注意它的开头是 {[. 你有Crop对象,在一个Crop的数组里面,所以你的JSON应该看起来像一个Crop的数组。

试试这个JSON。

[
    "corn": {
        "name": "corn",
        "currentStage": 1,
        "maxStage": 3,
        "currentLifeTime": 0,
        "nutritionalValue": 3,
        "timeToGrow": 360
    },
    "carrots": {
        "name": "carrots",
        "currentStage": 1,
        "maxStage": 3,
        "currentLifeTime": 0,
        "nutritionalValue": 3,
        "timeToGrow": 360
    }
 ]
© www.soinside.com 2019 - 2024. All rights reserved.