java - Jackson YAML 序列化对象数组格式
问题描述
我正在尝试以某种方式格式化我的 Jackson Yaml 序列化。
employees:
- name: John
age: 26
- name: Bill
age: 17
但是,当我序列化对象时,这是我得到的格式。
employees:
-
name: John
age: 26
-
name: Bill
age: 17
有没有办法摆脱数组中对象开头的换行符?这纯粹是个人喜好/人类可读性问题。
这些是我当前在 YAMLFactory 上设置的属性:
YAMLFactory yamlFactory = new YAMLFactory()
.enable(YAMLGenerator.Feature.MINIMIZE_QUOTES) //removes quotes from strings
.disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER)//gets rid of -- at the start of the file.
.enable(YAMLGenerator.Feature.INDENT_ARRAYS);// enables indentation.
我查看了 Jackson 中 YAMLGenerator 的 java 文档,并查看了有关 stackoverflow 的其他问题,但我找不到执行我想做的事情的选项。
我已经尝试过 CANONICAL_OUTPUT、SPLIT_LINES 和 LITERAL_BLOCK_STYLE 属性,最后一个是在设置 MINIMIZE_QUOTES 时自动设置的。CANONICAL_OUTPUT 似乎在数组周围添加了括号。SPLIT_LINES 和 LITERAL_BLOCK_STYLE 与多行字符串的处理方式有关。
解决方案
简短的回答是目前没有办法通过杰克逊做到这一点。这是由于snakeyaml 中的一个错误,如果您设置indicatorIndent 属性,空白将无法正确处理,因此snakeyaml 会添加新行。
我找到了直接使用snakeyaml 的解决方法。
//The representer allows us to ignore null properties, and to leave off the class definitions
Representer representer = new Representer() {
//ignore null properties
@Override
protected NodeTuple representJavaBeanProperty(Object javaBean, Property property, Object propertyValue, Tag customTag) {
// if value of property is null, ignore it.
if (propertyValue == null) {
return null;
}
else {
return super.representJavaBeanProperty(javaBean, property, propertyValue, customTag);
}
}
//Don't print the class definition
@Override
protected MappingNode representJavaBean(Set<Property> properties, Object javaBean) {
if (!classTags.containsKey(javaBean.getClass())){
addClassTag(javaBean.getClass(), Tag.MAP);
}
return super.representJavaBean(properties, javaBean);
}
};
DumperOptions dumperOptions = new DumperOptions();
//prints the yaml as nested blocks
dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
//indicatorIndent indents the '-' character for lists
dumperOptions.setIndicatorIndent(2);
//This is the workaround. Indent must be set to at least 2 higher than the indicator indent because of how whitespace is handled.
//If not set to 2 higher, then the newline is added.
dumperOptions.setIndent(4);
Yaml yaml = new Yaml(representer, dumperOptions);
//prints the object to a yaml string.
yaml.dump(object);
解决方法是在 DumperOptions 上设置 indent 属性。您需要将缩进设置为至少比 indicatorIndent 高 2 的值,否则将添加换行符。这是由于在snakeyaml 中如何处理空格。
推荐阅读
- java - 内存管理和 Java 堆
- java - 动态选择要使用的 DAO
- ios - 即使后台获取已关闭,如何在没有通知的情况下接收消息
- macos - Arduino串行监视器打印设置输出两次
- ruby - 为什么 self.method_name 不能访问私有方法?其中只有私有方法名可以在任何方法中访问 ruby 中的私有方法
- npm - yarn - 快速检查是否满足 `package.json` 和 `yarn.lock` 要求的正确方法?
- python - 使用美汤时只获得最后一行
- reactjs - react-router 可以更新 url 路径但不能更新浏览器历史记录吗?
- php - 使用Jquery时无法读取数据库,Ajax提交表单而不刷新页面
- jenkins - 安装 Jenkins 时说 C:\Users\Dell\.jenkins\war\images\RRZEIconSet-License.url (Access is denied)java.io.FileNotFoundException?