Unity C# JsonUtility没有对列表进行序列化。

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

我有一些数据需要序列化,但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中就不行了。

c# json unity3d serialization
2个回答
26
投票

在Unity中,你可能会得到空的Json,有4个已知的可能原因。

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

2.使用属性(getset)作为你的变量。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;
}

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

5.就像上面的例子,在 SpriteData 类,该变量必须是一个公共变量。如果它是一个私有变量,则添加 [SerializeField] 在它的顶部。

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

如果还是不行,那么你的json可能是无效的。读取 "4.TROUBLESHOOTING JsonUtility" 从中 "在Unity中序列化和反序列化Json和Json阵列" 帖子。这应该能给你提供如何解决这个问题的内幕。


0
投票

还有一个原因是程序员没有提到的,但却是个大麻烦。

[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);
// {}
© www.soinside.com 2019 - 2024. All rights reserved.