Импорт JSON без разбора данных - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь создать файл json со всеми бонусными характеристиками, которые вы получаете за уровень.

Json выглядит так:

{
  "0": {
    "Armor": 1,
    "Strenght": 1,
    "Mana": 2,
    "Power": 1,
    "Health": 1
  },
  "1": {
    "Armor": 1,
    "Strenght": 1
  }
}

Затем я вызываю загрузчик:

struct LevelBonus
{
    int Power;
    int Mana;
    int Strenght;
    int Armor;
    int Health;
}
Dictionary<string, LevelBonus> statsPerLevel;
statsPerLevel = FileLoaderManager.instance.LoadJSONData<Dictionary<string, LevelBonus>>("PlayerStats/level.json");

И где-то еще есть

public T LoadJSONData<T>(string path)
{
    string filePath = Path.Combine(Application.streamingAssetsPath, path);
    if (File.Exists(filePath))
    {
        string dataAsJson = File.ReadAllText(filePath);
        T loadedData = JsonUtility.FromJson<T>(dataAsJson);
        return loadedData;
    }
    else
    {
        Debug.LogError("Cannot load game data!");
        return default(T);
    }
}

Мои данные загружены, но не проанализированы правильно.В основном, нет ошибок, но данные не возвращаются, если файл прочитан, и до

T loadedData = JsonUtility.FromJson<T>(dataAsJson);

я могу правильно прочитать данные в виде строки.но что FromJson ничего не возвращает

Чего мне не хватает?

РЕДАКТИРОВАТЬ: https://answers.unity.com/questions/1583163/importing-data-from-json.html?childToView=1583169#comment-1583169

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

То, что я всегда делаю при загрузке Jsons, никогда не пишу их вручную.Я создаю экземпляр того, что я хочу сначала записать в память, а затем СОХРАНИТЬ в json - чтобы убедиться, что макет поля точно соответствует ожидаемому сериализатором - легко написать json, который действителен, но не имеет смыслапри сопоставлении с классом C #

В вашем случае ответ прост.в структуре Json у вас есть

{ field_name : field_value }

пар.Но когда он говорит «1»: значение, он никогда не будет десериализован, потому что имя поля - «1», которое не является допустимым именем поля в C # (оно должно начинаться с буквы).Объект определения, который вы десериализуете, должен выглядеть следующим образом:

class MyStats
{
 public int Armor;
 public int Strenght;
 public int Mana;
 public int Power;
 public int Health;
}

Я полагаю, что это неправильно, однако для десериализации вашего примера ваш контейнерный объект должен быть определен следующим образом (что неверно)

class MyContainerObject {public MyStats 1;// ОШИБКА: Неверное имя поля!общедоступные MyStats 2;// ОШИБКА: Неверное имя поля!}

Он не возвращает ошибку, так как Json действителен, и анализатор просто пропускает поля, которые не соответствуют определению класса, которое вы используете.

Относительно использования массивов вы можетелибо взломайте расширение-обертку (как предложено Dharmashree), что немного странно (JsonUtility нужно знать конкретный класс, к которому он десериализуется, и он не может перейти непосредственно к массиву или списку, например:

[
    {"a": 1 },
    {"b": 1 },
    {"c": 1 }
]

Будучи действительным json, он не будет анализироваться JsonUtility (необработанный анонимный массив), однако это будет

{
    "MyStats": [
      { "a": 1 },
      { "b": 2 },
      { "c": 1 }
    ]
}

, вы можете структурировать ваши данные так, чтобы они содержали массив внутри объекта контейнера, поэтомуВаш основной объект может быть определен следующим образом:

class MyContainerObject
{
   public MyStats[] stats; 
}

Доступ к вашим элементам осуществляется через myList [index]

В любом случае, я снова рекомендую начать с НАПИСАНИЯ json, представляющего вашу структуру,проверять, работает ли эта десериализация должным образом, и только затем редактировать файл вручную.

0 голосов
/ 22 декабря 2018

Попробуйте использовать массив Json.Вы можете следовать этому примеру здесь.https://www.newtonsoft.com/json/help/html/ToObjectComplex.htm

Невозможно комментировать, поэтому упоминание в ответе.

Класс Person, используемый в документации NewtonSoft, должен иметь следующую структуру.

public class Person
{
   public string Name {get;set;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...