Jackson: クラス ~~~~~ のシリアライザーが見つからず、BeanSerializer を作成するためのプロパティも見つかりません。質問する

Jackson: クラス ~~~~~ のシリアライザーが見つからず、BeanSerializer を作成するためのプロパティも見つかりません。質問する

次のようなクラスの ArrayList があります。

public class Person {
    String name;
    String age 
    List<String> education = new ArrayList<String> ();
    List<String> family = new ArrayList<String> (); 
    List<String> previousjobs = new ArrayList<String>(); 
}

このリストを Json として書きたいので、次のコードを試しました:

Writer out = new PrintWriter("./test.json");
mapper.writerWithDefaultPrettyPrinter().writeValueas(out, persons);

そして次のエラーメッセージが表示されました:

クラス ~~~~~~ のシリアライザーが見つからず、BeanSerializer を作成するためのプロパティも見つかりません (例外を回避するには、SerializationFeature.FAIL_ON_EMPTY_BEANS を無効にします) (参照チェーン: java.util.ArrayList[0] 経由)`

追加しようとしましたmapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)が、何らかの不明な理由ですべての Person オブジェクトが空になりました。

何が間違っているのでしょうか?

ベストアンサー1

抜粋ここ:

デフォルトでは、Jackson 2 は public のフィールド、または public の getter メソッドを持つフィールドのみで動作します。すべてのフィールドが private またはパッケージが private であるエンティティをシリアル化すると失敗します。

Personすべてのフィールドが含まれていますパッケージ保護ゲッターがないので、エラー メッセージが表示されます。メッセージを無効にしても、クラスは依然としてemptyJackson の観点からのものなので、当然ながら問題は解決しません。そのため、空のオブジェクトが表示され、エラーはそのままにしておく方がよいでしょう。

すべてのフィールドを次のように作成する必要がありますpublic

public class Person {
    public String name;
    // rest of the stuff...
}

または、次のように、各フィールドのパブリック ゲッターを作成します (また、フィールドをプライベートに設定することも推奨します)。

public class Person {
    private String name;

    public String getName() {
        return this.name;
    }
    // rest of the stuff...
}

おすすめ記事