jyaml解析float类型的问题 作者: 灯小笼 时间: 2018-09-13 分类: 开发 今天在使用[jyaml](http://jyaml.sourceforge.net/)解析一个配置类的时候,发现一个问题: * 整型和字符串的解析都没有问题 * float类型的解析则总是返回`0.0F`,无论是对值用引号包括,或者在后面加上大写的F,都是不行的。 写了个简单的测试用例: ```java import lombok.Data; import org.ho.yaml.Yaml; import org.junit.Assert; import org.junit.Test; public class TestYaml { @Test public void testLoadYaml() { String yamlStr = "foo: 1.2\nnum: 2000\nbar: 0.4"; TestConf conf = Yaml.loadType(yamlStr, TestConf.class); Assert.assertEquals(2000, conf.getNum()); Assert.assertEquals(1.2F, conf.getFoo(), 0.0F); Assert.assertEquals(0.4F, conf.getBar(), 0.0F); } @Data public static class TestConf { private int num; private float foo; private Float bar; } } ``` 测试总是通不过: ![42175-4q3xquavsom.png](https://c.dengxiaolong.com/blog/typecho/42175-4q3xquavsom.png-typecho) 后面经同事提醒,把`float`换成`double`类型就可以了,不过,不能精确匹配,总是有偏差的。新的测试用例如下: ```java import lombok.Data; import org.ho.yaml.Yaml; import org.junit.Assert; import org.junit.Test; public class TestYaml { @Test public void testLoadYaml() { String yamlStr = "foo: 1.2\nnum: 2000\nbar: 0.4"; TestConf conf = Yaml.loadType(yamlStr, TestConf.class); Assert.assertEquals(2000, conf.getNum()); Assert.assertEquals(0.0F, conf.getFoo(), 0.0001F); Assert.assertEquals(0.4F, conf.getBar(), 0.0001F); } @Data public static class TestConf { private int num; private float foo; private Double bar; } } ``` 终于通过去了,鉴于时间有限,详细原因后续再深究。 ![13216-6il9whu7zpl.png](https://c.dengxiaolong.com/blog/typecho/13216-6il9whu7zpl.png-typecho) 今天又看了一下[yaml](http://yaml.org/)官网上推荐的其他的类库。 Java: - [JvYaml ](https://jvyaml.dev.java.net/ "JvYaml ") # Java port of RbYaml - [SnakeYAML](http://www.snakeyaml.org/) # Java 5 / YAML 1.1 - [YamlBeans](http://yamlbeans.sourceforge.net/) # To/from JavaBeans - [JYaml](http://jyaml.sourceforge.net/) # Original Java Implementation - [Camel](https://www.github.com/decorators-squad/camel) # YAML 1.2 for Java. A user-friendly OOP library. 最后选择了[snakeyaml](http://www.snakeyaml.org/)下手。发现在这个库问题手到擒来,看来还是jyaml本身代码的问题。 要使用snakeyaml,在pom.xml中引入依赖即可 ```xml org.yaml snakeyaml 1.23 ``` 上一下snakeyaml的测试用例: ```java import lombok.Data; import org.junit.Assert; import org.junit.Test; import org.yaml.snakeyaml.Yaml; public class TestYaml { @Test public void testLoadYaml() { String yamlStr = "foo: 1.2\nnum: 2000\nbar: 0.4"; Yaml yaml = new Yaml(); TestConf conf = yaml.loadAs(yamlStr, TestConf.class); Assert.assertEquals(2000, conf.getNum()); Assert.assertEquals(1.2F, conf.getFoo(), 0.0001F); Assert.assertEquals(0.4F, conf.getBar(), 0.0001F); } @Data public static class TestConf { private int num; private float foo; private Double bar; } } ``` 标签: jyaml, yaml, java