Unity C#:如何将类的数组转换为JSON

时间:2016-07-15 07:27:39

标签: arrays json unity3d

我需要保存多个播放器的数据。我是通过制作一个PlayersInfo类数组并尝试将数组转换为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);

前两个打印语句返回&#34; {}&#34;第3个给出空引用错误。 TIA

4 个答案:

答案 0 :(得分:2)

正如我在评论中所说,没有直接的支持。需要Helper课程。这是我做出这个答案的唯一原因,因为即使在阅读了我提供的链接后你仍然遇到了问题。

创建一个名为.ToList()的新脚本。将下面的代码复制并粘贴到其中。

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; } } 替换所有JsonUtility个字词。我在下面为你做了这个:

JsonHelper

答案 1 :(得分:0)

基于JsonUtility documentation,不支持裸阵列。把数组放在一个类中。

  

在内部,此方法使用Unity序列化程序;因此   传入的对象必须得到序列化程序的支持:它必须是a   使用MonoBehaviour,ScriptableObject或普通类/结构   应用了Serializable属性。

通常,您可以使用它来序列化MonoBehaviour个对象,或使用Serializable属性的自定义类/结构。

答案 2 :(得分:0)

YES!目前不支持它,但总会有一个解决方法。使用这个类:

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;
    }
}

答案 3 :(得分:0)

我会使用Json.NET

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

string json = JsonConvert.SerializeObject(allPlayersArray);

More On SerializeObject

(尚未测试的代码示例)