Загрузка хэш-карты через JSON

Хэш-карта:

public HashMap<Perk, Boolean> perks;
public HashMap<Perk, Boolean> getPerks() {
    return perks;
}

Как сохраняю (отлично работает, использую GSON от Google):

object.add("perks", builder.toJsonTree(player.perks));

Предварительный просмотр сохранения:

"perks": {
    "DAMAGE_AMPLIFIER": true
  }

Как я пытаюсь загрузить, но не работает, ошибка ниже.

if (reader.has("perks")) {
    jsonToMap(reader.get("perks").toString(), player);
}

jsonToMap метод:

    public static void jsonToMap(String t, Player player) throws JSONException {

    JSONObject jObject = new JSONObject(t);
    Iterator<?> keys = jObject.keys();

    while(keys.hasNext()) {
        String key = keys.next().toString();
        boolean value = jObject.getBoolean(key); 
        player.perks.put(Perk.valueOf(key), value);
    }
}

Ошибка:

java.lang.NullPointerException
at com.callisto.world.entity.impl.player.PlayerLoading.jsonToMap(PlayerLoading.java:730)
at com.callisto.world.entity.impl.player.PlayerLoading.getResult(PlayerLoading.java:684)
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
107
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если мне нужно предположить, что perks имеет значение NULL, и поэтому, когда вы выполняете put, вы получаете нулевой указатель. Измените его на:

public HashMap<Perk, Boolean> perks=new HashMap<>(); //We init the hashmap here so we can putt stuff after that
public HashMap<Perk, Boolean> getPerks() {
    return perks;
}

Также вы можете изменить его на: Map<Perk, Boolean> perks=new HashMap<>(); и используйте интерфейс, а не реализацию в ваших методах

Это сработало отлично, но все еще есть нулевые значения. Я предполагаю, что там, где он помещается в хэш-карту, он делает это неправильно. Любая идея?

Taylan Selvi 08.05.2018 14:54

У вас есть нули на карте? Я предполагаю, что логическое значение = jObject.getBoolean (key); возвращает null, это может быть из-за вашего json или чего-то еще

Veselin Davidov 08.05.2018 14:55

Или, возможно, повторение JsonOject. Я не знаю реализации, но вы должны сделать что-то вроде jObject.get ("perks"). Keys (), что я предполагаю

Veselin Davidov 08.05.2018 14:58

Логической оболочке для логического типа при объявлении присваивается значение null, в отличие от собственного логического значения, которое по умолчанию имеет значение false.

Karan Modi 08.05.2018 15:00

да, я думаю, проблема в том, что он не получает правильного значения, когда повторяет JsonObject.

Veselin Davidov 08.05.2018 15:01

Другие вопросы по теме