我有一些我需要序列化/反序列化的数据,但是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中不起作用。
答案 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);
// {}