我有一些数据需要序列化,但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中就不行了。
在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阵列" 帖子。这应该能给你提供如何解决这个问题的内幕。
还有一个原因是程序员没有提到的,但却是个大麻烦。
[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);
// {}