2017-01-22 23 views
1

我有一些數據需要序列化/反序列化,但JsonUtility只是沒有做它應該做的。下面是我的工作對象:統一C#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中不起作用。

回答

9

有4種已知可能的原因,爲什麼你可能會在Unity中獲得空的Json。

。不包括[Serializable]。如果你不包括這個,你會得到空的json。

。使用屬性(get/set)作爲變量。 JsonUtility不支持這一點。

.Trying序列化比其他List的集合。

。您的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; 
} 

。像的例子中,在上面的SpriteData類給定的,變量必須是一個公共變量。如果它是私有變量,則在其頂部添加[SerializeField]

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

如果仍然沒有工作那麼你的JSON可能是無效的。閱讀「4.TROUBLESHOOTING JsonUtility」來自"Serialize and Deserialize Json and Json Array in Unity"帖子中的答案。這應該給你內部如何解決這個問題。

+1

我想這是某種魔術標籤或我不得不做的,謝謝。它現在按預期工作。 –

+0

我剛碰到這個,對我來說問題是5.我的領域沒有被標記爲公開的。我知道這是在規則,只是滑了我的腦海。 –

+0

@KylePostlewait這是一個常識性的事情,如果它是私人的,它不會被序列化。雖然,您可以將'[SerializeField]'放在專用字段的頂部以使其序列化。 – Programmer