ScriptableObject列表到Json

时间:2018-12-06 22:06:52

标签: unity3d

我想知道将ScriptableObjects列表保存到Json的最佳方法是什么。我目前正在使用Newtonsoft.Json的方式进行操作,并给我一个警告,因为从Json加载数据的方式是使用“ new ScriptObject”而不是“ ScriptableObject.CreateInstance”方法创建scriptableObjects的实例。这只是一个警告,我看不到任何重大错误,但这仍然引起了我的兴趣。

谢谢。

3 个答案:

答案 0 :(得分:2)

最好使用JsonUtility。 JsonUtility是一个统一类,具有用于处理JSON数据的实用程序功能。

您可以将FromJsonOverwrite(字符串json,对象objectToOverwrite)用于ScriptableObjects和MonoBehaviours。

您不应使用new关键字来创建或实例化scriptableObjects和monoBehaviours。因此,JsonUtility比其他标准的.net json库(例如Newtonsoft)更适合monoBehaviours和scriptableObjects。

JsonUtility Unity3D

答案 1 :(得分:0)

我绝对建议使用Newtonsoft版本(JsonDotNet
Unity版本有太多问题。当我切换到Newtonsoft版本时,事情变得如此简单。

您可以简单地说要序列化

string jsonString = JsonConvert.SerializeObject(obj);

或者您可以通过这样做简单地反序列化

MyClass obj = JsonConvert.DeserializeObject<MyClass>(jsonString);

答案 2 :(得分:0)

嗯,也许这是错误的方法,但是出于我的目标,我将自己的可脚本化对象列表的序列化/反序列化写入json,因为我将所有球员数据(球员位置,库存,任务)存储在服务器上的单个文本字段中,保存/加载简单。而且,我使用WebGL构建,所以我不知道Newtonsoft在不同平台上的表现。而且我也不想对此进行测试)

private string SerializeSOList<T>(List<T> SO_List)
    {
        string result = "";
        foreach (T item in SO_List)
        {
            result += JsonUtility.ToJson(item) + ", ";
        }
        return result;
    }

    private List<T> DeserializeSOList<T> (string json_string)
    {
        string[] stringSeparators = new string[] { "}," };
        List<T> result = new List<T>();
        string[] splitted = json_string.Split(stringSeparators, System.StringSplitOptions.None);
        for(int i =0; i < splitted.Length-1; i++)
        {
            string SO_string = splitted[i] + "}";
            Debug.Log(SO_string);
            T itemBasic = (T)System.Activator.CreateInstance(typeof(T));
            JsonUtility.FromJsonOverwrite(SO_string, itemBasic);
            result.Add(itemBasic);
        }
        return result;
    }

然后,您只需为任何可编写脚本的对象调用此函数,如下所示:

[SerializeField] public List<ItemBasic> basicUpgrades = new List<ItemBasic>();

    string json_basicUpgrades = SerializeSOList(basicUpgrades);

    basicUpgrades = DeserializeSOList<ItemBasic>(json_basicUpgrades);