如何借助JSON保存列表?

How to save List with help of JSON?

各位!

试图在组合 JSON 和 PlayerPrefs 的帮助下节省我的列表,但遇到了问题。它不保存我的列表并且不加载。它只给我我的零元素列表。

代码:

private List<Toggle> _listActiveToggles = new List<Toggle>();

public void Awake()
{
    Load();

    foreach (Toggle toggle in _listActiveToggles)
    {
        toggle.isOn = true;
    }
    
}

public void ChooseUsableBuffs(Toggle toggle)
{
    int level = PlayerPrefs.GetInt("HDD") / 10; 

    if (_listActiveToggles.Any(x => toggle))
    {
        _listActiveToggles.Remove(toggle);
        Debug.Log(_listActiveToggles.Count);
        return;
    }
    
    if (_listActiveToggles.Count >= level)
    {
        _listActiveToggles[0].isOn = false;
        _listActiveToggles.RemoveAt(0);
    }
    _listActiveToggles.Add(toggle);
    Save();
    Debug.Log(_listActiveToggles.Count);
}

public void Save()
{
    PlayerPrefs.SetString("Key" ,JsonUtility.ToJson(_listActiveToggles));
}

public void Load()
{
    _listActiveToggles = JsonUtility.FromJson<List<Toggle>>(PlayerPrefs.GetString("Key"));
}

试图检查 JSON 包含的内容,但它只显示:{}

JsonUtility不能直接序列化数组和列表类型。

你更需要一个像

这样的包装器class
[Serializable]
public class ToggleData
{
    public List<Toggle> _listActiveToggles = new List<Toggle>();
}

public ToggleData data;

现在可以序列化了

var json = JsonUtility.ToJson(Data);

并反序列化

JsonUtility.FromJsonOverwrite(json, data);

但是,在你的具体情况下,我想它无论如何都行不通。 UnityEngine.UI.Toggle 属于 MonoBehaviour 类型,您不能简单地将它们从 JSON!

反序列化

您只能将它们的设置和加载设置存储到现有 开关中。


我想实际上将 bool 的列表存储到 JSON 并遍历您的切换和列表并执行例如

就足够了
using System.Linq;

...

[Serializable]
public class ToggleData
{
    public List<bool> ToggleStates = new List<book>();
}

public ToggleData data;

[SerializeField] private List<Toggle> _listActiveToggles = new List<Toggle>();

然后通过

保存
data.ToggleStates = _listActiveToggles.Select(t => t.isOn).ToList();
var json = JsonUtility.ToJson(Data);

并通过

反序列化
JsonUtility.FromJsonOverwrite(json, data); 
for(var i = 0; i < Mathf.Min(data.ToggleStates.Count, _listActiveToggles.Count); i++)
{
    _listActiveToggles[i].isOn = data.ToggleStates[i];
}

但是请注意,这意味着您应该通过检查器在列表中引用所有要保存状态的切换,而不能简单地在运行时删除或添加条目!