Unity3d: Как сохранить словарь как объект в JSON? - PullRequest
0 голосов
/ 05 апреля 2020

Я новичок в Unity3d и C#. Я хочу хранить некоторые данные в JSON файлах, чтобы их можно было легко редактировать в текстовом редакторе . .

. До сих пор я использовал JsonUtility, потому что он был собран в Unity, и он прекрасно работал. Возможность использовать его так же просто, как:

string json = JsonUtility.ToJson(foo);
Foo foo = JsonUtility.FromJson<Foo>(json);

, была великолепна для меня.

Но теперь я добавил несколько словарей. Позже они конвертируются для более эффективных структур данных, но я хочу сериализовать их в JSON как именованные объекты.

Вот пример моего кода. Структура объектов в моем случае установлена ​​и известна. Одиночный словарь содержит объекты одного типа, а словарь задан глубже в иерархии сериализуемых объектов.

[System.Serializable]
public struct Bar{
    public int x;
    public int y;
}

[System.Serializable]
public class Foo{
    public int otherData = 43;
    public Dictionary<string,Bar> bar = new Dictionary<string,Bar>(){
        {"spaceship", new Bar{x = 7, y = 11}},
        {"pirates", new Bar{x = 5, y = -3}},
    };
}

Чего я хочу достичь:

{
   "otherData": 43,
   "bar": {
        "spaceship": {"x": 7, "y": 11},
        "pirates": {"x": 5, "y": -3}
   }
}

Есть ли способ сделать это работа?

Может быть, я могу написать о методах сериализации / десериализации для словаря?

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Используйте следующий код:

 static string ConvertFooClassToJson()
    {
        List<string> jsonStrings = new List<string>();
        foreach (FieldInfo field in typeof(Foo).GetFields())
        {
            string fieldName = field.Name;
            Foo fieldsInstant = new Foo();
            var fieldValue = field.GetValue(fieldsInstant);
            if (field.FieldType.IsValueType)
            {
                string valueType = $"{fieldName}:{fieldValue}";
                jsonStrings.Add(valueType);
            }
            else
            {
                dynamic dynamicDic = fieldValue;
                List<string> dicValues = new List<string>();

                foreach (var dicItem in dynamicDic)
                {
                    var itemKey = dicItem.Key;
                    var itemValue = dicItem.Value;

                    List<string> barClassLst = new List<string>();
                    Bar barValue = itemValue;
                    foreach (var barItem in barValue.GetType().GetProperties())
                    {
                        var barPropertyName = barItem.Name;
                        var barPropertyValue = barItem.GetValue(barValue);
                        barClassLst.Add($"{barPropertyName}:{barPropertyValue}");
                    }

                    var barPropertiesString = "{" + string.Join(',', barClassLst.ToArray()) + "}";

                    string dicString = $"{itemKey}:{barPropertiesString}";
                    dicValues.Add(dicString);
                }
                var fooString = "{" + string.Join(',', dicValues.ToArray()) + "}";
                string finalString = $"{fieldName}:{fooString}";
                jsonStrings.Add(finalString);
            }
        }
        string jsonResult = "{" + string.Join(',', jsonStrings.ToArray()) + "}";
        return jsonResult;
    }
0 голосов
/ 05 апреля 2020

Согласно этому этому ответу , JsonUtility поддерживает только простые типы и исключает словари (это явно указано в ответе).

Лучше всего было бы перейти на Json. NET, который доступен как пакет NuGet , который поддерживает более сложные варианты использования, такие как этот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...