9

プロモーションコードを使用して、ユーザーにサイトへの無料メンバーシップを提供する可能性のあるサイトに取り組んでいます。メンバーがサインアップするレベルは、プロモーションコードオブジェクトの属性であり、1または2のいずれかのintとしてデータベースに保存されます。ただし、メンバーレベルの属性がサイトのUIに関連するのは、特定のプロモーションコードに関連付けられたランディングページ。したがって、その場合、JSONによってメンバーレベルが無視されることは望ましくありません。ユーザーがサイトに戻り、アカウントにプロモーションコードオブジェクトが関連付けられると、メンバーレベルは気になりません。そのため、メンバーレベルの属性をJSONで無視する必要があります。

だから私の質問はこれです、@JSONIgnoreアクセスごとにオブジェクトの属性を設定することは可能ですか、それとも属性は無視されるか無視されないのですか?言い換えれば、次のような方法はありobject.getAttribute().setAttributeJSONIgnore(true | false)ますか?

4

2 に答える 2

7

いいえ。アノテーションベースのアプローチは静的です。カスタムを使用することはできますが、作成にコストがかかるためAnnotationIntrospector、結果のJsonSerializerインスタンスは再利用されます。

ただし、プロパティを除外する方法はいくつかあります。たとえば、「プロパティのフィルタリング」の記事を確認してください。

于 2012-07-12T16:22:04.660 に答える
3

私はJSONViews(http://wiki.fasterxml.com/JacksonJsonViews)で同様のことをしました。

ベースビューを作成してから、PromoPageビューで拡張します。シリアル化するオブジェクトで、各プロパティに注釈を追加します。だからあなたが毎回現れたいものは

@JsonView(Views.Base.class) 
String name;

これらの特定のプロモーションページにのみ表示したいプロパティは、次のようになります。

@JsonView(Views.PromoPage.class) 
Integer memberLevel;

次に、プロモーションを取得するためのJAX-RSメソッドが他のランディングページとは異なる場合は、そのように適切なビューでメソッドに注釈を付けることができます。

  @JsonView(Views.Base.class)
  @GET
  @Produces(MediaType.APPLICATION_JSON )
  public Object getNormalLandingPageInfo() {
    ...
  }

  @JsonView(Views.PromoPage.class)
  @GET
  @Produces(MediaType.APPLICATION_JSON )
  public Object getPromoLandingPageInfo() {
    ...
  }

そうでない場合は、ロジックで、PromoPageビューを表示するタイミングを決定するために必要なことをすべて実行してから、次のようにすることができます。

if (showPromoPage)
    objectMapper.writeValueUsingView(out, object, Views.PromoPage.class);
else
    objectMapper.writeValueUsingView(out, object, Views.Base.class);
于 2016-10-17T17:02:43.940 に答える