Как получить все дочерние элементы (и их дочерние элементы) в файле yaml, используя змею

Итак, я столкнулся с snakeyaml. Я знаю, как получить их ключи, используя java yaml.load(inputStream); , который вернет хэш-карту строки и объекта. Просто для демонстрации у меня есть файл yaml со значениями:

player:
  randie:
    score: 4

Когда я использую

File file = new File("test")
FileInputStream stream = new FileInputStream(file);

Map<String, Object> map = yaml.load(stream);

for (String str : map.keySet()) {
   System.out.println(map.get(str));
}

Результат будет:

{randie={score=4}}

Я столкнулся с другими вопросами о стеке, такими как это

Я хотел получить значение в самом внутреннем «вложенном» значении, не используя список хэш-карт, предоставленный правильный ответ в теме

Спасибо


person BrokenEarth    schedule 21.08.2018    source источник


Ответы (1)


Вы можете создать классы, представляющие структуру файла yaml, а затем загрузить его в правильном формате.

public class Result {
    private Player player;

    public Player getPlayer() {
        return player;
    }

    public void setPlayer(Player player) {
        this.player = player;
    } 
}

public class Player {
    private Randie randie;

    public Randie getRandie() {
        return randie;
    }

    public void setRandie(Randie randie) {
        this.randie = randie;
    } 
}

public class Randie {
    private int score;

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    } 
}

а затем загрузите его с помощью функции loadAs.

public class YamlDataInterpreter {

    public static void main(String[] args) {
        YamlDataInterpreter intepreter = new YamlDataInterpreter();
        intepreter.interpretYaml();
    }

    public void interpretYaml() {
        InputStream stream = this.getClass().getClassLoader()
            .getResourceAsStream("data.yml");

        Yaml yaml = new Yaml();
        Result res = yaml.loadAs(stream, Result.class);
        System.out.println(res.getPlayer().getRandie().getScore());
    }
}

https://github.com/KenavR/snakeyaml-example

person KenavR    schedule 21.08.2018
comment
Спасибо, хотя сейчас я делаю SimpleYaml. Хотя мне и не нужны объекты! - person BrokenEarth; 22.08.2018
comment
Затем вы можете изучить Reflection stackoverflow.com/questions/2989560/ oracle.com/technetwork/articles/java/ или просто прочитайте строку и извлеките значение вручную. - person KenavR; 22.08.2018
comment
Ага. Reflection — это API для доступа к классам, полям и методам в коде. Хотя, возможно, вы не поняли, что я сказал. Мне нужно было получить значение, не создавая класс. В общем, читать из файла. Это сэкономит место в памяти - person BrokenEarth; 22.08.2018
comment
Я понял это, но рефлексия — это не то, что я бы рекомендовал новичку. Если вы уже знаете об отражении, что вам тогда нужно? Кто-то реализует это с отражением? Вы работаете над системой ограничения ресурсов? Если да, то зачем вообще загружать библиотеку? Почему бы просто не работать со строкой? - person KenavR; 22.08.2018
comment
ааа все равно спасибо. Думаю, мне просто нужно создать класс парсера. Еще раз спасибо за помощь - person BrokenEarth; 22.08.2018