2016-10-16 12 views
2

私はやや複雑なメタデータ言語のためのYAMLの使用を調べています。 YAML's anchors and referencesを使用することができれば、文書を小さく、複雑にするのに役立ちます。私はJacksonのYAML実装がこの機能をサポートしていないことを示すようなテストコードを書いています(そして/またはSnakeYAMLがこの機能をサポートしていない)。ここでJackson YAML:アンカーと参照のサポート

は私のテストYAMLファイルです:

set_one: 
    bass: tama rockstar 22x16 
    snare: &ludwig ludwig supralight 6.5x15 
    tom1: tama rockstar 12x11 
    tom2: tama rockstar 16x16 

set_two: 
    snare: *ludwig 

私はそうのように、このファイルを解析しています:ここで

ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); 
    FileInputStream fis = null; 

    try 
    { 
     fis = new FileInputStream(file); 
     JsonNode nodeTree = mapper.readTree(fis); 
     examineObject(nodeTree, 0); 
    } 
    ... 

は私の "examineObject()" メソッド(あなたができるでしょうから出ています)それが何をするかを推測:

key = "set_one", type = OBJECT 
    key = "bass", type = STRING, value = "tama rockstar 22x16" 
    key = "snare", type = STRING, value = "ludwig supralight 6.5x15" 
    key = "tom1", type = STRING, value = "tama rockstar 12x11" 
    key = "tom2", type = STRING, value = "tama rockstar 16x16" 
key = "set_two", type = OBJECT 
    key = "snare", type = STRING, value = "ludwig" 

明らかに何かがDEBで、「set_one.snare」からアンカー値を省略するために十分知っていたが、 ugger、私はこの要素のJsonNodeのどこにでもその値を見つけることができません。本当の問題は、 "set_two.snare"の値がちょうど "ludwig"であることです。参照記号( '*')は削除されましたが、値は参照の値であり、参照している要素ではありません。

私はJacksonバージョン2.8.3とSnakeYamlバージョン1.17を使用しています。 JSONのためにすでにJacksonを使用しているはるかに大きなプロジェクトの一部に過ぎないので、私はJacksonを使用することに拘束されています。

ジャクソンが参照を自動的に解決し、参照された値のコピーを作成できるかどうかは、本当に好きです。私の例では、これは "set_two.snare"の値が "ludwig supralight 6.5x15"となることを意味します。

最初の選択肢が得られない場合は、ノードツリーを手動で後処理して参照を自分で解決できるように、Jacksonにアンカーと参照の両方を保存させてください。たとえば、「set_two.snare」の値が「* ludwig」であることがわかったとき、アンカー「& ludwig」を持つノードをツリーで検索し、そのノードのコピーを作成することができました。

答えがある場合、おそらく "com.fasterxml.jackson.dataformat.yaml.YAMLParser.Feature"クラスが何らかの形で含まれていると感じています。残念ながら、私が探している振る舞いを可能にする機能(存在する場合)については、ドキュメントを見つけることができません。

答えて

0

まず最初に、JacksonはYAMLのアンカーと参照をサポートしています。少なくとも、JacksonはオブジェクトIDの参照を@JsonIdentityInfoでサポートしています.1つのキーと値のペアを参照することはできませんオブジェクトです。

しかし、識別ID /参照の処理は、@JsonIdentityInfoで注釈を付けることによって指定された型およびプロパティに対してのみ有効です。 したがって、参照される可能性のある型またはプロパティのいずれかに注釈を付ける必要があります(両方を行う必要はありません)。

ここで役に立つのは、ジャクソンによるオブジェクトIDの処理がすべての形式で非常に似ていることです。つまりjackson-dataformat-yamlはYAMLが持つ(ネイティブの)オブジェクトIDを公開しています(JSONにはありません)データバインディングレベルでの処理は同一です。したがって、Object Id/ReferencesをJSON(余分なidプロパティを追加する)と連携させることができれば、YAMLでも同様に動作します。

YAMLParser.Feature.USE_NATIVE_OBJECT_ID YAMLを書くときに参照とidsがどのように表現されるかを決定する1つの余分なことがあります - デフォルトではネイティブアンカーを使用しますが、 "JSONライクな"プレーンプロパティ。

こちらがお役に立てば幸いです。追加の助けのために最もよい場所はjackson-usersメーリングリストです。

関連する問題