我需要保存多个播放器的数据。我是通过制作一个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
答案 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);
(尚未测试的代码示例)