私はやや複雑なメタデータ言語のための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"クラスが何らかの形で含まれていると感じています。残念ながら、私が探している振る舞いを可能にする機能(存在する場合)については、ドキュメントを見つけることができません。