4

こんにちは、相互に埋め込まれた UI オブジェクトはほとんどありません。例 #1:

class CarUI {
  public UserUI user;
  public UserUI agent;
  ....
  public UserUI getUser() {
    return user;
  }
  public UserUI getAgent() {
    return agent;
  }
}
class UserUI {
  @JsonView({Views.Public.class,Views.Private.class})
  public String name;
  @JsonView({Views.Private.class})
  public String phone;
  ...
}

ご覧のとおり、UserUI をパブリックとしてシリアル化すると、名前のみが公開されますが、プライベートの場合はすべてのフィールドが公開されます。

これが私の質問です: オブジェクト CarUI をシリアル化するときに、「ユーザー」の名前のみを公開し、「エージェント」の名前と電話の両方を公開したいと考えています。つまり、getUser() のゲッターで JsonView を Views.Public.class に変更し、getAgent() のゲッターで Views.Private.class に変更したいということです。

この新しいJsonViewを使用して、返されたオブジェクトのすべての階層をシリアル化するために、ゲッターでJsonViewを上書きする方法はありますか?

編集 済み 以下に示すように、JsonView 継承を使用して私の例 #1 を解決できます。より一般的なものはどうですか。例 2 は次のとおりです。

class CarUI {
  public UserUI user;
  public UserUI agent;
  ....
  public UserUI getUser() {
    return user;
  }
  public UserUI getAgent() {
    return agent;
  }
}
class UserUI {
  @JsonView({Views.Public.class,Views.Private.class})
  public String name;
  @JsonView({Views.Private.class})
  public String phone;
  @JsonView({Views.Public.class})
  public String avatarUrl;
  ...
}

この例では、エージェントには名前と電話、ユーザーには名前とアバターの URL を表示します。

4

2 に答える 2

1

必要に応じて、より一般的なケースを見つけました。基本的に、さまざまな JsonView を使用して、ゲッター内でプロパティを変換できます。

  @JsonView({ Views.Detail.class})
  public JsonNode getAgent() throws IOException {
      ObjectMapper mapper = new ObjectMapper();
      String json = mapper.writerWithView(Views. Private.class).writeValueAsString(agent);
      return mapper.readTree(json);
  }
于 2015-11-19T05:59:26.900 に答える