Разбор JSON объекта, который содержит другую JSON строку для объекта - PullRequest
0 голосов
/ 12 января 2020

В настоящее время я работаю над школьным проектом, в котором мне нужно было создать игру, в которой пользователь мог бы настроить колоду карт и сохранить ее в базе данных через REST API. Я успешно работал над этой частью, но я решил сохранить колоду карт как JSON String в моей таблице базы данных. Теперь у меня возникают проблемы при использовании Gson для синтаксического анализа объекта обратно в правильную модель, поскольку он ожидает правильно типизированный список, а не Json String.

У кого-нибудь есть хорошее решение, чтобы легко разобрать этот объект или извлечь колоду карт из строки Json перед синтаксическим анализом остальной части объекта?

Я приведу пример кода для отображения текущей структуры моего объекта и Json:

Модель для преобразования в

public class CharacterModel{
private String characterName;
private int maxHp
private List<BattleCard> cardDeck

public CharacterModel(){}

//Getters and Setters for all paramters below
}

Json Формат

{
  "characterName": "TestCharacter;",
  "maxHp": "4",
  "cardDeck": "{Json String with the List of Cards here}"
}

Какой наилучший способ решить эту проблему ? Из-за способа, которым JSON String вкладывается в родительскую JSON String, он не распознается Gson как объект при попытке преобразования. Любая помощь с этой проблемой будет принята с благодарностью.

1 Ответ

1 голос
/ 12 января 2020

Как правило, в настоящее время более вероятно использование JSON -B и / или JSON -P , поскольку оно является частью спецификации java. Однако GSON также поддерживает связывание. Когда вы работаете с POJO / объектами, вам обычно не нужно генерировать или анализировать вручную JSON в 2020 году. Связывание - это слово, которое вы ищете;)

Я реализовал Например, для JSON -B и GSON они в любом случае не сильно отличаются.

    Card jsonbCard = new Card();
    jsonbCard.name = "JSON-B";
    jsonbCard.value = 9001;
    Card gsonCard = new Card();
    gsonCard.name = "GSON";
    gsonCard.value = -9001;

    List<Card> cardList = new ArrayList<>();
    cardList.add(jsonbCard);
    cardList.add(gsonCard);

    Jsonb jsonb = JsonbBuilder.create();
    String listSerialized = jsonb.toJson(cardList);
    System.out.println(listSerialized);

    List<Card> cardListFromJson = jsonb.fromJson(listSerialized, new ArrayList<Card>(){}.getClass().getGenericSuperclass());

    Gson gson = new Gson();  
    List<Card> cardListFromJson_GSON = gson.fromJson(listSerialized,  new TypeToken<List<Card>>(){}.getType());

Это сгенерировало следующую строку JSON: [{"name":"JSON-B","value":9001},{"name":"GSON","value":-9001}] и десериализовало строку обратно в List из Card.

Итак, в вашем случае вы можете

  1. создать другой класс, содержащий cardDeck в качестве строки, связать JSON с этим, создать действительный класс Character и установить Список, связывая этот cardDeck String с List.
  2. , используя синтаксический анализ и извлекая строку cardDeck из JSON, удаляя ее из JSON, анализируя ее для объекта, проанализируйте извлеченную cardDeck строку в список и установите ее для ранее извлеченного объекта.
  3. правильно сериализуйте, и у вас нет этого беспорядка;)

Основная ошибка в том, что cardDeck в вашем JSON не должно быть String для начала.

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