Unity C#JsonUtility没有序列化列表

Mat*_*ier 11 c# serialization json unity-game-engine

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

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

public class SpriteDataCollection
{
    public SpriteData[] sprites;
}
Run Code Online (Sandbox Code Playgroud)

如果我创建一个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));
Run Code Online (Sandbox Code Playgroud)

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

Pro*_*mer 21

有四种已知可能的原因可能导致你在Unity中获得空Json.

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

2.使用property(get/set)作为变量.JsonUtility不支持这一点.

3,尝试序列化除以外的集合List.

4.你的 json是多数组,JsonUtility它不支持并需要一个包装工作.

问题看起来像#1.你错过[Serializable]了这些课程.您必须添加using System;才能使用它.

[Serializable]
public class SpriteData {
    public string sprite_name;
    public Vector2 sprite_size;
    public List<Vector2> subimage;
}
Run Code Online (Sandbox Code Playgroud)

[Serializable]
public class SpriteDataCollection
{
    public SpriteData[] sprites;
}
Run Code Online (Sandbox Code Playgroud)

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

[Serializable]
public class SpriteDataCollection
{
    [SerializeField]
    private SpriteData[] sprites;
}
Run Code Online (Sandbox Code Playgroud)

如果仍然没有工作,那么你的json可能无效.从"序列化和反序列化Unity中的Json和Json数组"帖子中的答案中读取"4.TROUBLESHOOTING JsonUtility".这应该会让你了解如何解决这个问题.