Как десериализовать и сериализировать json unity
мне нужно добавить к JSON элемент, но вместо этого мой скрипт переписывает весь файл. Как это можно реализовать?
JSON файл при двойном вызове функции сейчас:
{"id":1,"LoginData":["one","two"],"title":"Student"}
Как мне нужно:
{"id":1,"LoginData":["one","two"],"title":"Student"},{"id":1,"LoginData":["one","two"],"title":"Student"}
Мой код:
using UnityEngine;
using System.IO;
public class JSONController : MonoBehaviour
{
public UserData userData;
[System.Serializable]
public class UserData
{
public int id;
public string[] LoginData;
}
public void Save()
{
File.AppendAllText(Application.streamingAssetsPath + "/UserBD.json", JsonUtility.ToJson(userData));
}
public void Load()
{
userData = JsonUtility.FromJson<UserData>(File.ReadAllText(Application.streamingAssetsPath + "/UserBD.json"));
}
}
Ответы (1 шт):
Объект в JSON это что-то в фигурных скобах
{...}
Коллекция в JSON это что-то в квадратных скобках, например коллекция объектов это
[{...},{...}]
Вы же сейчас просите
{...},{...}
Это не является валидным JSON, а следовательно вообще не является JSON.
Но допустим, вы такое попросили просто по незнанию или опечатались, допустим вам нужна коллекция объектов.
То есть структура данных у вас будет не UserData, а UserData[] или List<UserData>, массив или список, что для JSON сериализаторов не имеет значения.
Но здесь возникает другая проблема, JsonUtility не умеет сериализовать коллекции на верхнем уровне. Варианта решения 2.
1. Инкапсулировать коллекцию в объект
public class UserData
{
public int id;
public string[] LoginData;
}
public class JsonData
{
public List<UserData> Items { get; set; }
}
Тогда можно вот так создать
JsonData data = new JsonData();
data.Items = new List<UserData>();
UserData userData = new UserData();
userData.id = 1;
userData.loginData = new string[] {"one", "two"};
data.Items.Add(userData);
Вот так сериализовать
string json = JsonUtility.ToJson(data);
File.WriteAllText(Path.Combine(Application.streamingAssetsPath, "UserBD.json"), json);
Вот так десереализовать
string json = File.ReadAllText(Path.Combine(Application.streamingAssetsPath, "UserBD.json"));
JsonData data = JsonUtility.FromJson<JsonData>(json);
List<UserData> items = data.Items;
2. Использовать другой сериализатор, например JSON.NET
Установить NuGet пакет Newtonsoft.Json и подключить пространство имен
using Newtonsoft.Json;
Тогда вот так создать
List<UserData> items = new List<UserData>();
UserData userData = new UserData();
userData.id = 1;
userData.loginData = new string[] {"one", "two"};
items.Add(userData);
Вот так сериализовать
string json = JsonConvert.SerializeObject(items);
File.WriteAllText(Path.Combine(Application.streamingAssetsPath, "UserBD.json"), json);
Вот так десереализовать
string json = File.ReadAllText(Path.Combine(Application.streamingAssetsPath, "UserBD.json"));
List<UserData> items = JsonConvert.DeserializeObject<List<UserData>>(json);
Кстати, ставить аттрибут [Serializable] для этого сериализатора не требуется.
Не используйте File.AppendAllText, JSON невозможно дописать в конец файла, так как там есть закрывающие скобки. Нужно перезаписывать файл полностью.
Ещё старайтесь избегать вложенных публичных классов. Это может только больше запутать.
Не делайте так
class
{
class { }
}
Делайте так
class { }
class { }