JsonFx deserliazation返回null unity3d

时间:2016-02-10 10:48:14

标签: unity3d deserialization json-deserialization jsonfx

当我尝试使用Json反序列化JsonFx字符串时,我收到值null。

这是我的Json String

{
  "PlayerID": 123,
  "PlayerName": "Avi",
  "DemiGods": {
    "Red": {
      "Name": "Red",
      "Level": 20,
      "Attack": 5,
      "Dodge": 1,
      "Defence": 10,
      "Speed": 10
    },
    "Blue": {
      "Name": "Blue",
      "Level": 20,
      "Attack": 5,
      "Dodge": 1,
      "Defence": 10,
      "Speed": 10
    },
    "Green": {
      "Name": "Green",
      "Level": 20,
      "Attack": 5,
      "Dodge": 1,
      "Defence": 10,
      "Speed": 10
    },
    "Light": {
      "Name": "Light",
      "Level": 20,
      "Attack": 5,
      "Dodge": 1,
      "Defence": 10,
      "Speed": 10
    },
    "Dark": {
      "Name": "Dark",
      "Level": 20,
      "Attack": 5,
      "Dodge": 1,
      "Defence": 10,
      "Speed": 10
    }
  },
  "PlayerGrid": {
    "Red": {
      "x": 0,
      "y": 1
    },
    "Blue": {
      "x": 1,
      "y": 1
    },
    "Green": {
      "x": 2,
      "y": 1
    },
    "Light": {
      "x": 2,
      "y": 2
    },
    "Dark": {
      "x": 3,
      "y": 2
    }
  },
  "AIGrid": {
    "Red": {
      "x": 0,
      "y": 1
    },
    "Blue": {
      "x": 1,
      "y": 1
    },
    "Green": {
      "x": 2,
      "y": 1
    },
    "Light": {
      "x": 2,
      "y": 2
    },
    "Dark": 
    {
      "x": 3,
      "y": 2
    }
  }
}

This is my class where i stores the data from Json

public class UnitsInfo :MonoBehaviour
{
    public string PlayerName;
    public int PlayerID;
    public List<DemiGods> demigodslist = new List<DemiGods>();
    public List<GridData> playerGridlist = new List<GridData>();
    public List<GridData> AIGridList = new List<GridData>();

    public UnitsInfo() 
    {
        Debug.Log("Default Constructor");
    }

    public UnitsInfo(string _name, int id, List<DemiGods> Godlist, List<GridData> plist, List<GridData> AIlist)
    {
        PlayerName = _name;
        PlayerID = id;
        demigodslist = Godlist;
        playerGridlist = plist;
        AIGridList = AIlist;
    }

    public class DemiGods
    {
        public string Name;
        public int Level;
        public float Attack;
        public float Dodge;
        public float Defence;
        public float Speed;
        public DemiGods() 
        {
            Debug.Log("DemIGOds DeFALUT ConsTruCtoR");
        }
        public DemiGods(string _name, int _lvl, float _attack, float _dodge, float _Defence, float _speed)
        {
            Name = _name;
            Level = _lvl;
            Attack = _attack;
            Dodge = _dodge;
            Defence = _Defence;
            Speed = _speed;
        }
    }

    public class GridData
    {
        public Vector2 pos;

        public GridData() { Debug.Log("Grid DAta DeFALUT ConsTruCtoR"); }
        public GridData(int x, int y)
        {
            pos.x = x;
            pos.y = y;
        }
    }
  }

This is where is deserialize data 
public class JsonData: MonoBehaviour 
{
    public string JSONString;
    void Start()
    {
        UnitsInfo HerosList = JsonReader.Deserialize<UnitsInfo>(JSONString);
        Debug.Log(HerosList);
    }
}

The Debug.log return null. Where im going wrong??

Thanks in Advance

1 个答案:

答案 0 :(得分:1)

我认为你的json与你所追求的并不匹配。在你的情况下,我认为你期望红色,蓝色,绿色是DemiGods对象,其中红色,蓝色,绿色是他们的名字。

但是json目前的做法是,它希望输入Red,Blue,Green。

    {
    "PlayerID": 123,
    "PlayerName": "Avi",
    "DemiGods": [{
        "Name": "Red",
        "Level": 20,
        "Attack": 5,
        "Dodge": 1,
        "Defence": 10,
        "Speed": 10
    }, {
        "Name": "Blue",
        "Level": 20,
        "Attack": 5,
        "Dodge": 1,
        "Defence": 10,
        "Speed": 10
    }, {
        "Name": "Green",
        "Level": 20,
        "Attack": 5,
        "Dodge": 1,
        "Defence": 10,
        "Speed": 10
    }, {
        "Name": "Light",
        "Level": 20,
        "Attack": 5,
        "Dodge": 1,
        "Defence": 10,
        "Speed": 10
    }, {
        "Name": "Dark",
        "Level": 20,
        "Attack": 5,
        "Dodge": 1,
        "Defence": 10,
        "Speed": 10
    }]
}

在上面,DemiGods是一个DemiGods类型的对象数组,名称包含在对象中。因此,您必须声明一个方法来获取迭代数组,直到您获得与该名称匹配的对象或使用字符串DemiGods创建字典。

这同样适用于Json文件的其余部分。

编辑:

这是你的有效json(至少我认为)

{
    "PlayerID": 123,
    "PlayerName": "Avi",
    "DemiGods": [{
        "Name": "Red",
        "Level": 20,
        "Attack": 5,
        "Dodge": 1,
        "Defence": 10,
        "Speed": 10
    }, {
        "Name": "Blue",
        "Level": 20,
        "Attack": 5,
        "Dodge": 1,
        "Defence": 10,
        "Speed": 10
    }, {
        "Name": "Green",
        "Level": 20,
        "Attack": 5,
        "Dodge": 1,
        "Defence": 10,
        "Speed": 10
    }, {
        "Name": "Light",
        "Level": 20,
        "Attack": 5,
        "Dodge": 1,
        "Defence": 10,
        "Speed": 10
    }, {
        "Name": "Dark",
        "Level": 20,
        "Attack": 5,
        "Dodge": 1,
        "Defence": 10,
        "Speed": 10
    }],
    "PlayerGrid": [{
        "x": 0,
        "y": 1
    }, {
        "x": 1,
        "y": 1
    }, {
        "x": 2,
        "y": 1
    }, {
        "x": 2,
        "y": 2
    }, {
        "x": 3,
        "y": 2
    }],
    "AIGrid": [{
        "x": 0,
        "y": 1
    }, {
        "x": 1,
        "y": 1
    }, {
        "x": 2,
        "y": 1
    }, {
        "x": 2,
        "y": 2
    }, {
        "x": 3,
        "y": 2
    }]
}

这是csharp:

public class DemiGod
{
    public string Name { get; set; }
    public int Level { get; set; }
    public int Attack { get; set; }
    public int Dodge { get; set; }
    public int Defence { get; set; }
    public int Speed { get; set; }
}

public class PlayerGrid
{
    public int x { get; set; }
    public int y { get; set; }
}

public class AIGrid
{
    public int x { get; set; }
    public int y { get; set; }
}

public class RootObject
{
    public int PlayerID { get; set; }
    public string PlayerName { get; set; }
    public List<DemiGod> DemiGods { get; set; }
    public List<PlayerGrid> PlayerGrid { get; set; }
    public List<AIGrid> AIGrid { get; set; }
}

我并不完全知道JsonFX是如何工作的,但我猜想会像:

public class JsonData:MonoBehaviour{

    public RootObject root;
    void Start(){   
         root = JsonFX.Deserialize<RootObject>(jsonFile);
    }
}