次のYAML
があります。JavaでJackson
パーサーを使用して解析したいと思います。
Android:
"7.0":
- nexus
- S8
"6.0":
- s7
- g5
ios:
"10.0":
- iphone 7
- iphone 8
class
のJava Object
としてgetter
とsetter
を持つ作成されたAndroid
を作成しました。それはうまくいきます。しかし、6.0
と7.0? I'm using
Jackson`パーサーに対して同じことを行うにはどうすればよいですか。
ジャクソンがそれをサポートしているかどうかはわかりません。プレーンな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
注:コードはテストされていません。
アノテーションを試してみるべきだと思います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>