2

snakeyaml で yaml ドキュメントを javabean にロードできるかどうかを知りたいのですが、ドキュメント内のエントリに一致するエントリが javabean プロパティとして見つからない場合は、それを javabean 内の汎用マップに配置します。 ..

元。

public class Person {
  private String firstName;
  private String lastName;
  private Map<String, Object> anythingElse;

  //Getters and setters...
}

次のようなドキュメントをロードすると:

firstName: joe
lastName: smith
age: 30

age は Bean のプロパティではないため、{age, 30} を anythingElse マップに追加したいと考えています。

可能?

ありがとう。

4

3 に答える 3

0

いいえ、それは不可能です。

私の経験と試みから、それはうまくいきません。そのオブジェクトクラスのすべての属性よりもファイルをオブジェクトにロードしたい場合は、ゲッターとセッターが必要です (つまり、クラスは JavaBean でなければなりません。ウィキペディアを参照してください)。

私はあなたの Person クラス (適切な JavaBeanClass については wiki ページを参照してください) とこのコードを使用しました: http://codepaste.net/dbtzqb

私のエラーメッセージは次のとおりでした: " Line 3, column 4: Unable to find property 'age' on class: Person " したがって、この単純なプログラムが「予期しない」属性を持つことができないことを証明しています。これが私の迅速かつ簡単な結論です。私は広範囲に試していないので、可能かもしれませんが、そのような方法は知りません (readingmethods と JavaBean をバイパスする必要があります)。私は YamlBeans ( https://code.google.com/p/yamlbeans/ ) を使用したので、少し異なりますが、簡単で機能していると思います;]

それが役立つことを願っています!

編集

これにぶつかって申し訳ありません。回答を投稿するまで、投稿日は表示されませんでした..しかし、うまくいけば、他の人が助けを求めるのに役立つでしょう:3

于 2013-04-11T12:29:26.423 に答える
0

私はSnakeYamlを使用して次の(半無愛想なハック)を試していませんが、YamlBeansを使用して動作しています:

基本的な考え方は、java.util.Map の具体的な実装の 1 つを拡張するクラスを定義することです。次に、個別の値を選択する getter と、その他すべてを返す一般的な getter を定義します。

public class Person extends HashMap<String, Object>
{
    public String getFirstName()
    {
        return (String)this.get("firstName");
    }

    public String getLastName()
    {
        return (String)this.get("lastName");
    }

    public Map<String, Object> getExtensions()
    {
        Map<String, Object> retVal = (Map<String, Object>)this.clone();

        retVal.remove("firstName");
        retVal.remove("lastName");

        return retVal;
    }
}

SnakeYaml または YamlBeans のいずれかが、このクラスをイントロスペクトするときに表示されるさまざまな型の情報にどのように優先順位を付けるかはわかりませんが、YamlBeans (少なくとも) は、他の Map であるかのように情報をこのクラスに逆シリアル化することに満足しており、そうではないようです。追加の getter によって混乱する (つまり、「getExtensions」でつまずかない)。

于 2013-04-29T15:57:12.340 に答える