使用snakeyaml 解析bean 列表

Posted

技术标签:

【中文标题】使用snakeyaml 解析bean 列表【英文标题】:Parse list of beans with snakeyaml 【发布时间】:2017-04-22 05:39:32 【问题描述】:

是否可以用snakeyaml解析以下内容并获得List<Radio>(其中Radio是合适的java bean)?

-
  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>

【问题讨论】:

【参考方案1】:

我知道的唯一方法是使用顶部对象来处理集合。

Yaml 文件:

---
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();
        

    

【讨论】:

这需要更改yaml格式,因为它是由第三方Web服务提供的,我无法做到。 你只需要在开头插入两行: 嗯,这闻起来像个黑客......但不管用什么都行 :) 谢谢【参考方案2】:

实际上,Yaml 中有一个方法 loadAll,它返回 Iterable,但 yaml 文件在列表项之间应该有一个分隔符“---”。 该文件应如下所示:

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

(省略了 Radio DTO)代码应该是这样的:

public class Test 

    public static void main(String[] args) 
        Yaml yaml = new Yaml(new Constructor(Radio.class));
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("yourFile.yaml");
        
        List<Radio> radios = StreamSupport.stream(yaml.loadAll(inputStream).spliterator(), false)
                .filter(Radio.class::isInstance)
                .map(Radio.class::cast)
                .collect(Collectors.toList());
    

【讨论】:

以上是关于使用snakeyaml 解析bean 列表的主要内容,如果未能解决你的问题,请参考以下文章

无法解析类org.yaml.snakeyaml.Yaml @Grab('org.yaml:snakeyaml:1.17')Jenkins管道

SnakeYAML:解析时如何禁用下划线剥离?

包含对象列表的 SnakeYaml 反序列化类

使用 SnakeYaml 将 java 对象写入文件 - 使用 Yaml.dump() 时不会写出内部对象列表

如何在 SnakeYaml 中解析 YAML 文件的一部分

如何解决snakeyaml NoSuchMethodError:getStyle()