如何更改snakeyaml中的隐式类型(int to double)

Posted

技术标签:

【中文标题】如何更改snakeyaml中的隐式类型(int to double)【英文标题】:How to change implicit types in snakeyaml (int to double) 【发布时间】:2018-01-26 04:51:14 【问题描述】:

我的 yaml 文档看起来类似于 seq: [0, 0.23, 0.45, 0.67]

Snakeyaml 将 yaml 序列解析为具有值的 ArrayList:

[0]: 0 (Integer)
[1]: 0.23 (Double)
[2]: 0.45 (Double)
[3]: 0.67 (Double)

我需要所有这些值都是Double 类型,以便使用list.toArray(new Double[]) 将列表转换为Double[] - 否则会抛出ArrayStoreException,因为Integer 不是同一类型作为Double

    是否有一种可接受的方式将 ArrayList<Object> 转换为我错过的 Double[]? 如何配置 Snakeyaml 以将所有数字加载为双精度数?

附加信息

使用的 Snakeyaml 版本是 1.17。

我这样创建 Snakeyaml 实例:

private Yaml createYamlInstance() 
    DumperOptions dumperOptions = new DumperOptions();
    dumperOptions.setDefaultFlowStyle(FlowStyle.AUTO);
    return new Yaml(dumperOptions);


编辑

我查看了documentation,但看不到example 中的默认隐式类型是如何更改的。

【问题讨论】:

你解决了这个问题吗? 【参考方案1】:

根据本文档,数字的解析是按格式完成的:

http://symfony.com/doc/current/components/yaml/yaml_format.html#numbers

也许将 0 更改为 0.00 就足够了。

或者,如果无法更改格式,也许您可​​以在文档解析后在使用前强制转换 ArrayList 成员?

【讨论】:

是的,但是该文档是预先生成的,并且比我在问题中提供的摘录要复杂得多。因此无法更改文档。 我明白了。如果是这种情况,是否可以生成具有正确样式的文档而不是事后对其进行编辑? 如果真的没有其他选择,那将是我最后的选择,因为它可能会掩盖 freemarker 模板(通过它生成它)很多。 另一个选项可以在使用前简单地转换它,因为所有整数都会导致这个问题(4.00 写成 4 也将被解析为整数)。因此,如果您不能事先阻止数字的格式,则可以在访问任何特定 ArrayList 成员时简单地在事后使用强制转换。【参考方案2】:

您可以删除INT implicit Resolver。

然后 FLOAT 隐式解析器将完成这项工作。

【讨论】:

以上是关于如何更改snakeyaml中的隐式类型(int to double)的主要内容,如果未能解决你的问题,请参考以下文章

不可不会的scala隐式转换

Scala语法基础之隐式转换

Java 中的隐式转换是如何工作的?

Java 中的隐式转换是如何工作的?

Mysql中的隐式转换

25.scala的隐式转换