【问题标题】:Parsing Yaml in Java在 Java 中解析 Yaml
【发布时间】:2018-05-11 05:22:02
【问题描述】:

我有以下YAML 我想在Java 中使用Jackson 解析器进行解析。

android:
    "7.0":
        - nexus
        - S8
    "6.0":
        - s7
        - g5
ios:
    "10.0":
        - iphone 7
        - iphone 8

我创建了一个已创建的class,其中gettersetter 作为Java Object 用于android。它工作正常。但是我如何为6.07.0? I'm usingJackson` Parser 做同样的事情

【问题讨论】:

  • 您搜索过示例吗?第一个 Google 结果 - dzone.com/articles/read-yaml-in-java-with-jackson
  • @DanW 是的,我使用完全相同的页面作为参考。但我不确定当有数字时如何让它工作,例如:7.0
  • @Damien-Amen:只要把它们当作字符串。忽略它们恰好看起来像数字。它们实际上是字符串

标签: java jackson yaml jackson-databind


【解决方案1】:

我认为你应该尝试注释com.fasterxml.jackson.annotation.JsonProperty。我将在下面提供一个简短的示例。

示例 YAML 文件:

---
"42": "some value"

数据传输对象类:

public class Entity {

    @JsonProperty("42")
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

}

解析器:

public class Parser {

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
        Entity entity = mapper.readValue(new File("src/main/resources/sample.yml"), Entity.class);
        System.out.println(entity.getValue());
    }

}

控制台输出应该是:some value

P.S.我使用以下依赖项对其进行了测试:

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-yaml</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.2.3</version>
    </dependency>

【讨论】:

    【解决方案2】:

    不知道杰克逊是否支持;这是一个使用纯 SnakeYaml 的解决方案(我永远不会理解为什么人们使用 Jackson 来解析 YAML,而它所做的基本上是带走了它用作后端的 SnakeYaml 可能的详细配置):

    class AndroidValues {
         // showing what needs to be done for "7.0". "8.0" works similarly.
         private List<String> v7_0;
    
         public List<String> getValuesFor7_0() {
             return v7_0;
         }
    
         public void setValuesFor7_0(List<String> value) {
             v7_0 = value;
         }
    }
    
    // ... in your loading code:
    
    Constructor constructor = new Constructor(YourRoot.class);
    TypeDescription androidDesc = new TypeDescription(AndroidValues.class);
    androidDesc.substituteProperty("7.0", List.class, "getValuesFor7_0", "setValuesFor7_0");
    androidDesc.putListPropertyType("7.0", String.class);
    constructor.addTypeDescription(androidDesc);
    Yaml yaml = new Yaml(constructor);
    
    // and then load the root type with it
    

    注意:代码未经测试。

    【讨论】:

    • 我对 YAML 世界还很陌生,并且一直在评估各种产品,Jackson 确实似乎在后台使用了 SnakeYaml - 所以我问你同样的问题......为什么使用 Jackson YAML 和不是直接用 SnakeYaml 吗?
    • @Volksman Jackson 可能已经用于解析 JSON 或 XML,因此有些人可能宁愿使用他们已经在使用或熟悉的东西。
    猜你喜欢
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2015-12-06
    • 2018-02-16
    • 2013-06-10
    相关资源
    最近更新 更多