Разобрать список bean-компонентов с помощью snapyaml

Можно ли проанализировать с помощью snakeyaml следующий контент и получить List<Radio> (где Radio — соответствующий Java-бин)?

-
  id: chaine416
  name: 'France Inter'
  type: music
-
  id: chaine417
  name: 'France Culture'
  type: music
-
  id: chaine418
  name: 'Couleur 3'
  type: music

new Yaml().load(...); возвращает List<HashMap>, но вместо этого я хотел бы получить List<Radio>.


person sdabet    schedule 07.12.2016    source источник


Ответы (1)


Единственный известный мне способ - использовать верхний объект для обработки коллекции.

Ямл-файл:

---
stations:
-
  id: chaine416
  name: "France Inter"
  type: music
-
  id: chaine417
  name: "France Culture"
  type: music
-
  id: chaine418
  name: "Couleur 3"
  type: music

Я только что добавил "---", новый документ и атрибут stations.

Затем :

package snakeyaml;

import java.util.ArrayList;

public class Radios {

    ArrayList<RadioStation> stations = new ArrayList<RadioStation>();

    public ArrayList<RadioStation> getStations() {
        return stations;
    }

    public void setStations(ArrayList<RadioStation> stations) {
        this.stations = stations;
    }
}

Класс RadioStation:

package snakeyaml;


public class RadioStation {
    String id;
    String name;
    String type;


    public RadioStation(){

    }


    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }


    @Override
    public String toString() {
        return "RadioStation{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", type='" + type + '\'' +
                '}';
    }
}

И чтобы прочитать файл YAML:

package snakeyaml;

import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.Constructor;

import java.io.FileInputStream;
import java.io.FileNotFoundException;


public class Test {

    public static void main(String[] args) {
        Yaml yaml = new Yaml(new Constructor(Radios.class));
        try {
           Radios  result = (Radios) yaml.load(new FileInputStream("/home/ofe/dev/projets/projets_non_byo/TachesInfoengine/src/snakeyaml/data.yaml"));
            for (RadioStation radioStation : result.getStations()) {
                System.out.println("radioStation = " + radioStation);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }
}
person olikaf    schedule 07.12.2016
comment
Для этого требуется изменить формат yaml, чего я не могу сделать, поскольку он предоставляется сторонней веб-службой. - person sdabet; 07.12.2016
comment
Ну, вам просто нужно вставить 2 строки в начале: - person olikaf; 07.12.2016
comment
Ну, это пахнет хаком... но что бы ни работало :) Спасибо - person sdabet; 07.12.2016