2014-01-21 8 views
8

アノテーションのみを使用してJacksonでフィールドを持たないオブジェクトをシリアル化することはできますか?私は私が手なし注釈と、そのようなオブジェクトをシリアル化しようとすると:ジャンクションでデータのないオブジェクトをシリアライズ

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class [redacted].SubjectObjectFeatureExtractor and no properties discovered to create BeanSerializer 

私は、シリアライズデータを持たないように、クラスに注釈を付けるための方法を見ることなくlist of Jackson annotationsを検討しました。空のコンストラクタに@JsonCreatorを入れてみました(デシリアライゼーションアノテーションであるため動作しないと思います)。同じエラーが発生しました。 @JsonPropertyを置くアクセサまたはフィールドはありません。何か案は?

更新:これは、特定のタイプのデータに適用できる変換を表すオブジェクトのリストがあるためです。これらの変換の一部は、直列化する必要があるパラメータによって定義されますが、パラメータのないもの(問題のデータがないオブジェクト)です。私はこれらの変換のシーケンスを直列化および逆直列化することができるようにしたいと思います。また、クラス名がシリアル化されるようにDefaultTyping.NON_FINALを使用しています。

更新:例クラスは、私は特に私が正しくList<FeatureExtractor> Sをデシリアライズすることができ、このためのJSONがある限り、どのように見えるかを気にしない

class ExtractSomeFeature implements FeatureExtractor<SomeOtherType> { 
    public void extractFeature(SomeOtherType obj, WeightedFeatureList output) { 
      // do stuff 
    } 
} 

だろう。

['com.mycompany.foo.ExtractSomeFeature', {}] 

彼らはおそらくのようになりますので、FeatureExtractorの他のサブクラスは、実際のパラメータを持っているでしょう:私の印象では、デフォルトのタイピング、予想されるJSONを使用するようなものになるだろうということです

[`com.mycompany.foo.SomeParameterizedFeature', {some actual JSON stuff in here}] 

私は可能であればFeatureExtractorサブクラスを作成するエンドユーザーからこのようなハッカーを隠したいと考えています。toJSONString()メソッドの@JsonValueを使用して{}を返すことができます。

+0

空の '{}'がほしいだけですか?それにはどんな目的がありますか? –

+0

@SotiriosDelimanolis:あなたの質問に答えて質問を更新しました。 –

+0

シリアル化したいオブジェクトのタイプと、生成されるJSONをどのように想定するかの例を挙げてください。 –

答えて

3

は、問題を解決するようだ:

@JsonRootName("fred") 

のような注釈付き無関係の追加

@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.NONE) 

もそれを修正するようです。これは、クラスにジャクソンアノテーションを追加すると例外を防ぐことができるというJIRAチケットの主張と一致しているようです。ただし、クラス内の注釈を追加すると表示されません。

4

このケースをサポートするようにオブジェクトマッパーを設定する必要があります。

ObjectMapper objectMapper = ... 
    objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); 

あなたがここで見つけることができます。この機能のドキュメント:Fail on empty beams

機能なしアクセサが タイプに見つからない(とそれが意味していることを示すために何の注釈が存在しないときに何が起こるかを決定します がシリアル化されます)。有効にすると(デフォルト)、例外がスローされて、 を非シリアル化可能型として示します。無効にすると、オブジェクトは空のオブジェクト、つまりプロパティを持たない としてシリアル化されます。

+0

この回答はハックに依存せず、したがってより正確です。ありがとう! –

関連する問題