2016-07-15 120 views
0

我需要保存多個玩家的數據。我通過創建一個PlayersInfo類的數組並嘗試將數組轉換爲JSON來實現這一點。這是我的代碼Unity C#:如何將一個類的數組轉換爲JSON

PlayerInfo[] allPlayersArray = new PlayerInfo[1]; 

    allPlayersArray[0] = new PlayerInfo(); 
    allPlayersArray[0].playerName = "name 0"; 

    string allPlayersArrayJson = JsonUtility.ToJson(allPlayersArray); 
    print(allPlayersArrayJson); 
    PlayerPrefs.SetString("allPlayersArrayJson", allPlayersArrayJson); 

    string newJson = PlayerPrefs.GetString("allPlayersArrayJson"); 
    print(newJson); 

    PlayerInfo[] newArray = new PlayerInfo[1]; 

    newArray = JsonUtility.FromJson<PlayerInfo[]>(newJson); 

    print(newArray[0].playerName); 

前兩個打印語句返回「{}」,第三個打印語句給出空引用錯誤。 TIA

+0

Unity Json串行器不直接支持這個。你需要一個輔助類才能工作。我認爲這是一個重複的問題。這裏是你的答案http://stackoverflow.com/a/36244111/3785314開始閱讀它說的地方** 2.MULTIPLE DATA(ARRAY JSON)** – Programmer

+0

Thanks @Programmer,你能幫我實際使用它嗎?我剛剛複製幫助類,現在我想知道如何使用它來轉換我的數組?請注意我需要進一步修改該數組。 –

+0

我發佈的答案的鏈接顯示您要執行此操作的步驟。向下滾動並嘗試關注它們。如果有問題,請告訴我。然後我會發佈一個解決方案。在發佈答案之前,您必須告訴我您嘗試了什麼。 – Programmer

回答

1

就像我在我的評論說,沒有直接支持。需要類Helper。這是我做出這個答案的唯一原因,因爲即使在閱讀我提供的鏈接之後,您仍然遇到問題。

創建一個名爲JsonHelper的新腳本。複製並粘貼下面的代碼。

using UnityEngine; 
using System.Collections; 
using System; 

public class JsonHelper 
{ 

    public static T[] FromJson<T>(string json) 
    { 
     Wrapper<T> wrapper = UnityEngine.JsonUtility.FromJson<Wrapper<T>>(json); 
     return wrapper.Items; 
    } 

    public static string ToJson<T>(T[] array) 
    { 
     Wrapper<T> wrapper = new Wrapper<T>(); 
     wrapper.Items = array; 
     return UnityEngine.JsonUtility.ToJson(wrapper); 
    } 

    [Serializable] 
    private class Wrapper<T> 
    { 
     public T[] Items; 
    } 
} 

您的問題中的代碼現在應該可以工作。您所要做的就是用JsonHelper替換所有JsonUtility字。我爲你做了如下:

void Start() 
{ 
    PlayerInfo[] allPlayersArray = new PlayerInfo[1]; 

    allPlayersArray[0] = new PlayerInfo(); 
    allPlayersArray[0].playerName = "name 0"; 

    string allPlayersArrayJson = JsonHelper.ToJson(allPlayersArray); 
    print(allPlayersArrayJson); 
    PlayerPrefs.SetString("allPlayersArrayJson", allPlayersArrayJson); 

    string newJson = PlayerPrefs.GetString("allPlayersArrayJson"); 
    print(newJson); 

    PlayerInfo[] newArray = new PlayerInfo[1]; 

    newArray = JsonHelper.FromJson<PlayerInfo>(newJson); 

    print(newArray[0].playerName); 
} 
+0

它用作示例。謝謝。讓我稍後在我的真實項目中嘗試一下,然後我將其作爲答案打勾。 –

+0

慢慢來。讓我知道是否有任何問題。雖然,不應該有任何。 – Programmer

+1

它工作完美。非常感謝你。 –

0

基於JsonUtility documentation,不支持裸集。將數組放入類中。

該方法在內部使用Unity序列化器;因此您傳遞的 對象必須受序列化程序支持:它必須是 MonoBehaviour,ScriptableObject或普通類/結構,其中應用了 可序列化屬性。

通常,您將使用它來序列化MonoBehaviour對象,或使用Serializable屬性的自定義類/結構。

0

是的!它目前不受支持,但總是有解決方法。使用這個類:

public static class JsonHelper 
{ 
    public static T[] getJsonArray<T>(string json) 
    { 
     try 
     { 
      string newJson = "{ \"array\": " + json + "}"; 
      Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>> (newJson); 
      return wrapper.array; 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(ex.Message); 
     } 
    } 

    [Serializable] 
    private class Wrapper<T> 
    { 
     public T[] array = null; 
    } 
} 
0

我會用Json.NET

PlayerInfo[] allPlayersArray = new PlayerInfo[] { p1, p2, p3 }; 

string json = JsonConvert.SerializeObject(allPlayersArray); 

More On SerializeObject

(代碼示例尚未測試)