парсинг объекта в JsonObject (Bukkit)

Статус
Закрыто для дальнейших ответов.

sweettie

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
_Sweettie_
Решил значит сделать один свой небольшой плагин, и столкнулся с проблемой. У меня есть объект User в котором храниться Player и лист ещё одних объектов Stash. Мне надо парсить в json объект User, но вот проблема, я не понимаю как:(. Объясните пожалуйста

User:
upload_2021-6-30_19-47-20.png

Stash:
upload_2021-6-30_19-48-8.png
 
Player это не pojo класс, это интерфейс, тебе нужно зарегистрировать сериализатор для него и реализовать.
 
JsonSerializer & JsonDeserializer
 
gson, который уже имеется в ядре

new Gson().toJson(object)

Вместо Player, в таком случае, лучше хранить его UUID.


upload_2021-6-30_19-47-20-png.59771
тебе ide намекает, что ты лишний раз создаешь лист при инициализации переменной stashlist, когда в конструкторе передаешь уже другой готовый лист
 
Я думаю, что лучше сделать так:
PHP:
public class User {

    private final Player player;
    private final List<Stash> stashes = new ArrayList<>();

    public User(Player player, List<Stash> stashes) {
        this.player = player;
        if (stashes != null) this.stashes.addAll(stashes);
    }
 
}
А еще я бы переопределил методы equals & hashCode у юзера и стеша + заменил бы коллекцию на HashSet, чтобы стеши были уникальны и не повторялись. И так же стоит заменить игрока на UUID, как посоветовал BukkitProfi, либо сделать два поля UUID и Player, где UUID != null, а игрок уже может быть хоть null
 
Последнее редактирование:
Я думаю, что лучше сделать так:
PHP:
public class User {

    private final Player player;
    private final List<Stash> stashes = new ArrayList<>();

    public User(Player player, List<Stash> stashes) {
        this.player = player;
        if (stashes != null) this.stashes.addAll(stashes);
    }
 
}
А еще я бы переопределил методы equals & hashCode у юзера и стеша + заменил бы коллекцию на HashSet, чтобы стеши были уникальны и не повторялись. И так же стоит заменить игрока на UUID, как посоветовал BukkitProfi

зачем лишний раз создавать лист, когда можно присвоить уже имеющийся?


Код:
public class User {
    private final UUID uniqueId;
    private final Map<Integer, Stash> stashes;
 
   public User(UUID uniquieId, Map<Integer, Stash> stashes) {
       this.uniquieId = uniquieId;
       this.stashes = stashes;
    }

    public Stash getStash(int id) {
        return stashes.get(id);
    }
   
    public void addStash(Stash stash) {
        stashes.put(stash.getId(), stash);
    }

// etc
}
 
зачем лишний раз создавать лист, когда можно присвоить уже имеющийся?


Код:
public class User {
    private final UUID uniqueId;
    private final Map<Integer, Stash> stashes = new HashMap<();
 
   public User(UUID uniquieId, Map<Integer, Stash> stashes) {
       this.uniquieId = uniquieId;
       this.stashes = stashes;
    }

    public Stash getStash(int id) {
        return stashes.get(id);
    }
 
    public void addStash(Stash stash) {
        stashes.put(stash.getId(), stash);
    }

// etc
}
И какой толк инициализации поля stashes в твоем случае, если в конструкторе ты его присваиваешь к другой мапе?)
 
на нулл проверяешь при загрузке. а gson не выдаст нулл, если загружаешь сохраненную структуру объекта.

И какой толк инициализации поля stashes в твоем случае, если в конструкторе ты его присваиваешь к другому?)
на автоматизме написал, поправил.
 
Последнее редактирование:
Лично для меня мой вариант куда практичнее. По крайней мере ты будешь всегда уверен, что список/мапа у тебя никогда не будет равна null
 
Последнее редактирование:
Тема закрыта, всем спасибо
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх