web-dev-qa-db-ja.com

Java)でYamlを解析する

次のYAMLがあります。JavaでJacksonパーサーを使用して解析したいと思います。

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

classJava Objectとしてgettersetterを持つ作成されたAndroidを作成しました。それはうまくいきます。しかし、6.07.0? I'm usingJackson`パーサーに対して同じことを行うにはどうすればよいですか。

6
Damien-Amen

ジャクソンがそれをサポートしているかどうかはわかりません。プレーンなSnakeYamlを使用したソリューションは次のとおりです(基本的に、バックエンドとして使用するSnakeYamlで可能な詳細な構成を削除するだけで、Jacksonを使用してYAMLを解析する理由がわかりません):

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

注:コードはテストされていません。

6
flyx

アノテーションを試してみるべきだと思います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>
3
CDV