首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Snakeyaml -如何在流样式上进行自定义控制

Snakeyaml -如何在流样式上进行自定义控制
EN

Stack Overflow用户
提问于 2018-01-16 19:43:59
回答 1查看 1.7K关注 0票数 5

我正在尝试用snakeyaml在java中创建一个YAML文件,但我在获取所需格式时遇到了问题。其中一些子项在使用DumperOptions.FlowStyle.BLOCK时格式正确,而其他部分在使用默认DumperOptions.FlowStyle.AUTO时格式正确。下面是我所说的一个最小的例子:

代码语言:javascript
复制
Map<String,Integer> children1 = new LinkedHashMap();
children1.put("Criteria-1", 2);
children1.put("Criteria-2",1);

List<List<Object>> children2 = new ArrayList<>();
List<Object> list = new ArrayList<>();
list.add("Criteria-1");
list.add("Criteria-2");
list.add(new Integer(1));
children2.add(list);

Map<String,Object> map = new LinkedHashMap();
map.put("Version",2.0);
map.put("Parent-1",children1);
map.put("Parent-2",children2);      

//Style 1 - AUTO - Correct format for Parent-2
Yaml yaml1 = new Yaml();
String style1 = yaml1.dump(map);
System.out.println(style1);

//Style 2 - BLOCK - Correct format for Parent-1
DumperOptions options = new DumperOptions();
options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
Yaml yaml2 = new Yaml(options);
String style2 = yaml2.dump(map);
System.out.println(style2);

第一个选项输出如下,它为Parent-2提供了正确的格式,但不为Parent-1提供了正确的格式:

代码语言:javascript
复制
Version: 2.0
Parent-1: {Criteria-1: 2, Criteria-2: 1}
Parent-2:
- [Criteria-1, Criteria-2, 1]

第二个选项输出以下内容,它为Parent-1提供了正确的格式,但不为Parent-2提供了正确的格式:

代码语言:javascript
复制
Version: 2.0
Parent-1:
  Criteria-1: 2
  Criteria-2: 1
Parent-2:
- - Criteria-1
  - Criteria-2
  - 1

我需要的输出是:

代码语言:javascript
复制
Version: 2.0
Parent-1:
  Criteria-1: 2
  Criteria-2: 1
Parent-2:
- [Criteria-1, Criteria-2, 1]

实际的文件包含锚点和别名,所以我不能分两次转储yaml。有没有一种方法可以自定义地图的哪些部分应该是FLOW,哪些应该是BLOCK?我应该使用另一种方法来构建地图吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-16 20:57:16

看起来您不能使用DumperOptionsmappingssequences指定不同的流样式。

但您可以做的是覆盖Representer以强制映射的非缺省流样式,如下所示:

代码语言:javascript
复制
DumperOptions options = new DumperOptions();
options.setDefaultFlowStyle(DumperOptions.FlowStyle.AUTO);

Yaml yaml2 = new Yaml(new Representer() {
    @Override
    protected Node representMapping(Tag tag, Map<?, ?> mapping, Boolean flowStyle) {
        return super.representMapping(tag, mapping, false);
    }
},options);
String style2 = yaml2.dump(map);
System.out.println(style2);

这应该会给出您想要的输出:

代码语言:javascript
复制
Version: 2.0
Parent-1:
  Criteria-1: 2
  Criteria-2: 1
Parent-2:
- [Criteria-1, Criteria-2, 1]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48280482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档