Как десериализовать массив именных объектов в именно объекте посредством Unity JsonUtility?

Добрейшего времени, доброжелательный! Братишка, выручай нужно посредством стандартных средств Unity десериализовать JSON в C# Объект, ниже приведу пример чего я хочу. Нужно просто подсказать, как грамотно реализовать класс для сериализации/десериализации JSON строки.

Пример JSON

{
"cars": [
  {"cars_bigs": [{"force": 500, "weight": 1000}, {"force": 1000, "weight": 4000}]},
  {"cars_smaller": [{"force": 100, "weight": 800}, {"force": 300, "weight": 400}]}
]
}



Пример моей неудачной реализации классов

[Serializable]
public class CarsResult {
  public CarItem[] cars;
}

[Serializable]
public class CarItem {
  public string CarType;
  public Car[] CarObjects;
}

[Serializable]
class Car {
  public int force;
  public int weight
}



P.S. Мой вариант реализации не рабочий, просьба, если не сложно, то объясните почему и как правильно десериализовать такой JSON ответ
  • Вопрос задан
  • 394 просмотра
Решения вопроса 1
vabka
@vabka Куратор тега C#
Токсичный шарпист
1. У тебя json выглядит так:
- cars
  - cars_bigs
    - force: 500
      weight: 1000
    - force: 1000
      weight: 4000
  - cars_smaller
    # и так далее

Значит тебе объекты нужны такие:
class CarsResult {
  public CarItem[] Cars { get; set; }
}
class CarItem {
  // К сожалению, нельзя на уровне системы типов выразить "Объект, у которого есть либо поле А либо поле Б"
  // Так что придётся указать оба поля
 // И нельзя это разрулить на уровне настроек сериализатора, если не придумывать кастомный сериализатор (не знаю, можно ли кастомизировать юнитивский)
  public Car[] BigCars { get; set; }
  public Car[] SmallCars { get; set; }
}
class Car {
  public int Force { get; set; }
  public int Weight { get; set; }
}

PS: В английском языке прилагательные ставятся перед существительными и не имеют числа. Так что "большие машины" - это "big cars", но никак не "Cars bigs". А "машины по меньше" - это "Smaller cars"
PPS: Надеюсь, как указать нужные имена ты сам догадаешься, почитав документацию..
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Farawa
Стандартный json то ли полу-рабочий, то ли я что-то не понимаю, у меня с ним тоже были проблемы и выходом была библиотека newtonsoft, вроде в юнити сразу есть, попробуй ее, с ней все заработало
Ответ написан
@Ente
Unity developer
1) Не используй стандартный JSON от Unity - он ужасен, он не работает с уровнем вложенности большим, чем 1.
2) Newtonsoft гораздо лучше, сама команда Unity включила его в свои packages.
3) Чтобы считать класс в JSON, тебе нужно создать его с атрибутом [Serializable]. Также обрати внимание, что не все базовые классы/структуры в Unity могут быть сериализованы. Например, могут возникнуть проблемы с Vector3, кое где может потребовать написать свой класс для этого.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы