Помогите Считывание в gson

  • Автор темы Автор темы 4561
  • Дата начала Дата начала

4561

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
4561
https://github.com/steve4744/WhatIsThis
Потребовалось разобраться в исходниках самостоятельно, чтобы возник вопрос:
считывающий файлы элемент кода находится в lang/EnumLang, скорее всего в этом моменте -

private static void readFile(EnumLang enumLang, BufferedReader reader) throws IOException {
try {
Gson gson = new Gson(); //инициализация файлового формата
Type type = new TypeToken<Map<String, String>>() {
}.getType(); //инициализация типа данных
Map<String, String> map = gson.fromJson(reader, type); //считывание файлов
enumLang.map.putAll(map); //запись результата
} finally {
reader.close();
}
}

каким лучше образом следует преобразовать из такого json содержания:
{
"minecraft.block.hay_block": "Hay bale"
}
в желаемый:
{
"biome.plains" : {
"minecraft.block.hay_block": "Hay bale"},
"biome.jungle" : {
"minecraft.block.hay_block": "Bamboo block",
"minecraft.block.sponge": "Moss block"}
}

Я лично собирался бы аналогичным образом создать новый список, использующий значения из org.bukkit.block.Biome, вызывать по readFile новый void readFileAgain для биомов, но считаю что разбираться в этом без посторонней помощи более затратно по времени, чем предполагал изначально, даже не имея показательных примеров и опыта по работе с подобным форматом...
 
Лучше используй простой pojo класс, там не нужно генерить тип.
 
Нельзя ли использовать два вида записи тогда для биома и локализации (gson и pojo), предполагаю что мне потребуется хранить enum biomes в отдельном классе и даже сделать новый метод readFile для него, не совсем понимаю тогда как это должно правильно выглядеть...
https://github.com/steve4744/WhatIs...ithub/steve4744/whatisthis/lang/EnumLang.java
 
Нельзя ли использовать два вида записи тогда для биома и локализации (gson и pojo), предполагаю что мне потребуется хранить enum biomes в отдельном классе и даже сделать новый метод readFile для него, не совсем понимаю тогда как это должно правильно выглядеть...
https://github.com/steve4744/WhatIs...ithub/steve4744/whatisthis/lang/EnumLang.java
Ох жесть какая, к чему так все усложнять)
 
Ох жесть какая, к чему так все усложнять)
Наверно класс EnumLang содержит enum локализаций как основу, думаю странно оформлять дополнительный список внутри этого, либо я не вижу других путей решения, потому могу прислать что либо дополнительно...
 
Как поступать иначе в таком случае? Также имеется следующий код проверки целостности при инициализации:
но я думаю что в нём не потребуется вносить изменений для формата списка биомов отчасти потому что здесь плагин читает местонахождение и название файла для загрузки, может быть ошибаюсь...

public static void init() {
for (EnumLang enumLang : EnumLang.values()) {

if (!WhatIsThis.getPlugin().getSettings().getLangs().contains("all") && !WhatIsThis.getPlugin().getSettings().getLangs().contains(enumLang.getLocale())) {
continue;
}
try {
readFile(enumLang, new BufferedReader(new InputStreamReader(EnumLang.class.getResourceAsStream("/lang/" + enumLang.locale + ".json"), Charset.forName("UTF-8"))));
Bukkit.getLogger().info(enumLang.getLocale() + " has been loaded.");
} catch (Exception e) {
Bukkit.getLogger().info("Fail to load language file " + enumLang.getLocale());
e.printStackTrace();
}
}
File customizedLangDir = new File(WhatIsThis.getPlugin().getDataFolder(), "lang");
if (!customizedLangDir.exists()) {
customizedLangDir.mkdirs();
}

for (File file : Objects.requireNonNull(customizedLangDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".json")))) {
EnumLang enumLang = get(file.getName());
if (enumLang.getLocale().equals(EN_US.locale) && !file.getName().contains(EN_US.locale)) {
Bukkit.getLogger().info("Failed to load customized language file " + file.getName());
} else {
try (FileInputStream fs = new FileInputStream(file)) {
readFile(enumLang, new BufferedReader(new InputStreamReader(fs, Charset.forName("UTF-8"))));
Bukkit.getLogger().info("Failed to load customized language file " + file.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
 
Назад
Верх