web-dev-qa-db-ja.com

Jackson(JSON)によるシリアライズ - 「シリアライザーが見つけません」というメッセージが表示される

Jacksonを使って非常に単純なオブジェクトを直列化しようとすると例外が発生します。エラー:

org.codehaus.jackson.map.JsonMappingException:MyPackage.TestAクラスのシリアライザが見つかりませんでした。また、BeanSerializerを作成するためのプロパティが見つかりませんでした(例外を回避するには、SerializationConfig.Feature.FAIL_ON_EMPTY_BEANSを無効にしてください)。

以下は直列化する単純なクラスとコードです。

誰が私がこのエラーを受け取る理由を私に言うことができますか?

public class TestA {
    String SomeString = "asd";
}

TestA testA = new TestA();
ObjectMapper om = new ObjectMapper();
try {
    String testAString = om.writeValueAsString(testA); // error here!

    TestA newTestA = om.readValue(testAString, TestA.class);
} catch (JsonGenerationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (JsonMappingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
225
Ted

既に説明したように、ObjectMapperインスタンスのデフォルト設定は、パブリックフィールドであるかパブリックなgetter/setterを持つプロパティにのみアクセスすることです。フィールドをパブリックにするかパブリックのgetter/setterを提供するようにクラス定義を変更する代わりに、(基礎となるVisibilityCheckerに)別のプロパティ可視性ルールを指定することもできます。 Jackson 1.9はそのための便利なObjectMapper.setVisibility()メソッドを提供しています。元の質問の例では、これを次のように設定します。

myObjectMapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);

Jackson> 2.0の場合:

myObjectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

関連する設定オプションの詳細と詳細については、 ObjectMapper.setVisibility() のJavaDocsを確認することをお勧めします。

291

Jacksonがそのクラスをシリアライズするには、SomeStringフィールドはpublicである必要があります(現在はパッケージレベルの分離です)か、それにgetterメソッドとsetterメソッドを定義する必要があります。

66
Chris

私のソースコードにも同じ問題があります。追加しました

ゲッター

そして

セッター

問題は解決しました。

39

私の場合の問題は、Jacksonが属性もメソッドもない空のオブジェクトを直列化しようとしていたことです。

例外で示唆されているように、空のBeanで失敗しないように次の行を追加しました。

ジャクソン1.9用

myObjectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

Jackson 2.Xの場合

myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

単純な例は jackson disable fail_on_empty_beans にあります。

22
Martín C

私はコントロールを持っていた子クラスについても同じ問題を抱えていました。オブジェクトマッパーは共通のモジュールの中にあり、アクセスできませんでした。オブジェクトがシリアル化されることになっていた私の子クラスにこのアノテーションを追加することによってそれを解決しました。

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
8
Pavan Kumar

そのオブジェクトを含むクラスを編集できるのであれば、通常は注釈を追加するだけです。

import com.fasterxml.jackson.annotation.JsonIgnore;

@JsonIgnore 
NonSerializeableClass obj;
6
ZiglioUK

このエラーは、戻りステータスに.build()メソッドを追加し忘れた場合にもスローされます。

return Response.status(Status.OK);         // fails
return Response.status(Status.OK).build(); // works

Build()メソッドなしで以下のエラーが出ました。

org.codehaus.jackson.map.JsonMappingException: No serializer found for class com.Sun.jersey.core.spi.factory.ResponseBuilderImpl
5
patrics

変数がprivateとして宣言されているために問題がある可能性があります。これをpublicに変更すれば、うまくいきます。

より良い方法は、getterメソッドとsetterメソッドを使うことです。

これで問題は解決します。

3

Oracle Javaアプリケーションの場合は、ObjectMapperインスタンス化の後にこれを追加します。

mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
3
LEMUEL ADANE

これが3つのオプションです。

  1. アクセスされるデータ/クラスはpublicである必要があります
  2. publicでなければ、ゲッターとセッターを追加する
  3. または@JsonIgnore("context")を追加
2
Santhosh Kumar

私はこれを行う少なくとも3つの方法を見つけました:

  1. シリアル化しようとしているエンティティにpublic gettersを追加します。
  2. public gettersが不要な場合は、エンティティの最上部に注釈を追加します。これにより、JacksonのデフォルトがVisbility=DEFAULTから@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)に変更されます。
  3. objectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);を設定してObjectMapperをグローバルに変更してください。この機能をグローバルに必要としないのであれば、これは避けるべきです。

あなたのニーズに基づいて選択してください。

1
georger

私は休止状態のプロキシオブジェクトを介した遅延ロードに関しても同様の問題を抱えていました。遅延ロードされたプライベートプロパティを持つクラスに次のようにアノテーションを付けることによってそれを回避しました:

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
1
N. berouain

SpringBoot2.0、以下のコードで解決しています:

@Bean public ObjectMapper objectMapper() {
 return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);}
1
Janus

ゲッターとセッターを追加しましたが、同じエラーが発生しました。後で私はバグを見つけました、それは私が問題を引き起こしていた保護としてゲッターとセッターをcgahngedしたSonarのアドバイスによるものです。私はそれが期待どおりに働いたことを修正したら。

0
yellow