web-dev-qa-db-ja.com

writeValueAsStringを使用してオブジェクトをシリアル化した後、Jacksonの逆シリアル化が失敗する

Com.fasterxml.jackson.databind.ObjectMapperクラス(com.fasterxml.jackson.core:jackson-databind:2.9.5)を使用しています次のクラスのオブジェクトを逆シリアル化しようとしています。

class MyClass {

    String name;

    MyClass(String name) {
        this.name = name;
    }
}

私が現在実行しているコードは次のとおりです。

    MyClass myClass = new MyClass("test");
    objectMapper.registerModule(new ParameterNamesModule())
        .registerModule(new Jdk8Module())
        .registerModule(new JavaTimeModule())
        .configure(FAIL_ON_UNKNOWN_PROPERTIES, false)
        .setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

    String text = objectMapper.writeValueAsString(myClass);
    objectMapper.readValue(text, MyClass.class);

例外をスローする最後の行で失敗します:

com.fasterxml.jackson.databind.exc.MismatchedInputException:com.pckge.MyClassのインスタンスを作成できません(少なくとも1つの作成者が存在します):[ソース:でオブジェクト値からデシリアライズできません(デリゲートまたはプロパティベースの作成者なし)文字列) "{"名前 ":"テスト "}";行:1、列:2]

私の目標は、MyClassのコンストラクターでJsonCreatorやJsonPropertiesなどのアノテーションを使用せずにオブジェクトを正常に逆シリアル化できるようにオブジェクトマッパーを構成することです。

  • これは可能ですか?
  • どの構成が欠けていますか?

どうもありがとう!

編集1:@Deanによる返信は問題を解決します。ただし、デフォルトのコンストラクターも使用したくありません。

6
pafede2

ジャクソンは値を設定するためにゲッターとセッターを使用します。したがって、クラスを変更する必要があります。

class MyClass {

    String name;

    MyClass(String name) {
      this.name = name;
   }

   MyClass(){}

   public void setName(String name) {
     this.name = name;
   }

  public String getName(String name) {
     return this.name;
  }
}
7
Dean

デフォルトのコンストラクターなしでこれを解決する適切な方法は、クラスコンストラクターにJsonCreatorおよびJsonPropertyアノテーションを追加することです。

class MyClass {

    String name;

    @JsonCreator
    MyClass(@JsonProperty("name") String name) {
        this.name = name;
    }
    ...
}
12
steve

loombokを使用している場合は、クラスの@Builderアノテーションを削除してください。これが私の問題でした。

1
user7695590