2011-12-07 4 views
1

私は(問題を表示するには、このビットを抽出)のようなJSON文字列をデシリアライズしようとしています(ジャクソン1.9.2)@JsonIgnoreが動作するように取得:階層にミックスインの注釈付きのデシリアライゼーションおよび多型タイプ

{ 
    "$type": "com.example.StringProperty", 
    "value": "hello world", 
    "name": "text", 
    "readOnly": false 
} 

以下のミックスインの注釈

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="$type") 
abstract public class PropertyMixin 
{ 
    @JsonProperty 
    public String name; 
    //@JsonIgnore 
    //public boolean readOnly; 
    @JsonProperty 
    public int type; 

    PropertyMixin(@JsonProperty("name") String pName, @JsonProperty("type") int pType) 
    { 
    } 
} 

abstract public class StringPropertyMixin 
{ 
    @JsonProperty 
    public String value; 
    //@JsonIgnore 
    //public boolean readOnly; 

    @JsonCreator 
    public StringPropertyMixin(@JsonProperty("name") String pName, @JsonProperty("value") String value) 
    { 
    } 
} 

を使用して

public class Property 
{ 
    public String name; 
    public int type; 

    Property(String pName, int pType) { name = pName; type = pType; } 
} 

public class StringProperty extends Property 
{ 
    public String value;   
    StringProperty(String pName, String pValue) { 
     super(pName, String); 
     value = pValue; 
    }  
} 

のように見えるのクラスジャクソン1.9.2で、私は取得していますエラーが

Unrecognized field "readOnly" (Class com.example.StringProperty), not marked as ignorable

である私は@JsonIgnoreを使用してみましたが、それは(私はそれを試してみましたか確認するためにコメントアウトコードの位置を確認してください)助けにはなりませんでした。私はおそらく何かが不足していますが、もう一組の目はそれを見て私を助ける必要があると思います。

これは、デシリアライゼーション環境がどのように見えるかです:

 objectMapper.setVisibilityChecker(objectMapper.getSerializationConfig().getDefaultVisibilityChecker() 
       .withFieldVisibility(JsonAutoDetect.Visibility.NONE) 
       .withGetterVisibility(JsonAutoDetect.Visibility.NONE) 
       .withSetterVisibility(JsonAutoDetect.Visibility.NONE) 
       .withCreatorVisibility(JsonAutoDetect.Visibility.NONE)); 

     MixinRegistrations module = new MixinRegistrations(); 
     objectMapper.registerModule(module); 

とミックスインモジュールは、私はすべての助けに感謝

@Override 
public void setupModule(SetupContext context) 
{ 
    context.setMixInAnnotations(Property.class, PropertyMixin.class); 
    context.setMixInAnnotations(StringProperty.class, StringPropertyMixin.class); 
} 

のように見えます。前もって感謝します。

PS:違いがあるのか​​どうかわかりませんが、.NET Framework v4で書かれたライブラリによってJSONが生成されています。

答えて

3

作成者として委任したメソッドにreadOnlyフィールドのパラメータがないため、Jacksonさんに問題があると思います。だから、この欠落しているパラメータを静かに無視するのではなく、Jacksonはエラーを投げています(良い動作)。 JsonIgnoreProperties注釈を使用してみてください。以前はこれを使用する必要はありませんでしたが、デシリアライズでは作成者が必要としないフィールドを明示的に指定することができます。

ああ、thisも同様です。

編集:あなたの問題は、そのクラスではありません Another question that the asker found that was useful.

+0

はい、あなたが望む動作なら@JsonIgnoreProperties(ignoreUnknown = true)を追加することができます –

+0

@Dunes:この状況で '@ JsonIgnore'が動作しない場合、' @ JsonIgnoreProperties'はどのように役立ちますか? '@ JsonIgnoreProperties'は' @ JsonIgnore'を複数の値に拡張したものです。 – alokoko

+0

私はなぜ '@ JsonIgnore'が私の場合にはうまくいかなかったのか理解しましたが、' @ JsonIgnoreProperties'は[this post](http:// stackoverflow。com/questions/7438474/what-is-wrong-with-my-jsoncreator-and-mixin-annotation)が含まれています。 @ JsonIgnorePropertiesアノテーションを指摘してくれてありがとう。 – alokoko

3

注ジャクソンが認識されない性質を持っているのではなく、JSONは、プロパティを持っていること。あなたはthis wiki pageと読むことができます。

@JsonIgnorePropertiesは、クラスに注釈を追加するときにフィールドまたはセッターを必要としないため、@JsonIgnoreとは異なり、ここで動作します。さらに、不明なプロパティーをすべて無視するために使用できます。

+0

リンクをありがとう。答えの30秒前に、私は物事の仕組みをどのように理解したかについてのコメントを投稿しました。 :-) – alokoko

+0

素晴らしい!うれしいことが今働いています。 – StaxMan

0
@JsonIgnoreProperties({"propX", "propY"}) 

クラスレベルで正常に機能しますか。

関連する問題