Unity C#JsonUtility没有序列化列表

时间:2017-01-22 03:42:54

标签: c# json unity3d serialization

我有一些我需要序列化/反序列化的数据,但是JsonUtility并没有做到它应该做的事情。这是我正在使用的对象:

public class SpriteData {
    public string sprite_name;
    public Vector2 sprite_size;
    public List<Vector2> subimage;
}

public class SpriteDataCollection
{
    public SpriteData[] sprites;
}

如果我创建一个SpriteDataCollection,并尝试使用JsonUtility序列化它,我只得到一个空对象{}。以下是它的构建方式:

            SpriteData data = new SpriteData();
            data.sprite_name = "idle";
            data.sprite_size = new Vector2(64.0f, 64.0f);
            data.subimage = new List<Vector2> { new Vector2(0.0f, 0.0f) };

            SpriteDataCollection col = new SpriteDataCollection();
            col.sprites = new SpriteData[] { data };

            Debug.Log(JsonUtility.ToJson(col));

调试日志仅打印“{}”。它为什么不序列化任何东西?我已经测试了它,并且序列化一个SpriteData完全按照它应该做的那样,但它在SpriteDataCollection中不起作用。

2 个答案:

答案 0 :(得分:19)

有四种可能的原因可能会导致你在Unity中获得空Json。

1 。不包括[Serializable]。如果你不包括这个,你会得到空的json。

2 。使用属性(get / set)作为变量。 JsonUtility不支持这一点。

3 。继续序列化List以外的集合。

4 。您的json是多个数组,JsonUtility不支持,需要wrapper才能工作。

问题似乎是#1 。您缺少类[Serializable]。您必须添加using System;才能使用它。

[Serializable]
public class SpriteData {
    public string sprite_name;
    public Vector2 sprite_size;
    public List<Vector2> subimage;
}

[Serializable]
public class SpriteDataCollection
{
    public SpriteData[] sprites;
}

5 。就像上面SpriteData类中给出的示例一样,变量必须是公共变量。如果它是私有变量,请在其顶部添加[SerializeField]

[Serializable]
public class SpriteDataCollection
{
    [SerializeField]
    private SpriteData[] sprites;
}

如果仍然无法正常工作,那么你的json可能无效。从"Serialize and Deserialize Json and Json Array in Unity"帖子的答案中读取“4.TROUBLESHOOTING JsonUtility”。这应该会让你了解如何解决这个问题。

答案 1 :(得分:1)

程序员没有提及的另一个原因,但它是个大问题:

[Serializable]
public struct MyObject
{
    public string someField;
}

[Serializable]
public class MyCollection
{
    public readonly List<MyObject> myObjects = new List<MyObject>();
    //     ^-- BAD
}

如果列表使用readonly,则列表不会序列化。例如

MyCollection collection = new MyCollection();
collection.myObjects.Add(new MyObject {someField = "Test"});
string json = JsonUtility.ToJson(collection);
// {}