レンダリングする前に、いくつかのフィールドを名前で除外する必要があります。フィールドのリストは動的なので、注釈を使用できません。
カスタムシリアライザーを作成しようとしましたが、フィールド名を取得できません。
GSON では を使用しましExclusionStrategy
たが、Jackson にはそのような機能はありません。同等のものはありますか?
以下の名前でフィールドを除外する例は、私のブログ投稿、Gson vJackson-Part4からのものです。(を検索しPropertyFilterMixIn
ます。)この例は、ユーザー指定のフィールド名のリストにaFilterProvider
をSimpleBeanPropertyFilter
使用する方法を示しています。serializeAllExcept
@JsonFilter("filter properties by name")
class PropertyFilterMixIn {}
class Bar
{
public String id = "42";
public String name = "Fred";
public String color = "blue";
public Foo foo = new Foo();
}
class Foo
{
public String id = "99";
public String size = "big";
public String height = "tall";
}
public class JacksonFoo
{
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper();
mapper.getSerializationConfig().addMixInAnnotations(
Object.class, PropertyFilterMixIn.class);
String[] ignorableFieldNames = { "id", "color" };
FilterProvider filters = new SimpleFilterProvider()
.addFilter("filter properties by name",
SimpleBeanPropertyFilter.serializeAllExcept(
ignorableFieldNames));
ObjectWriter writer = mapper.writer(filters);
System.out.println(writer.writeValueAsString(new Bar()));
// output:
// {"name":"James","foo":{"size":"big","height":"tall"}}
}
}
(注:関連するAPIは、最近のJacksonリリースでわずかに変更されている可能性があります。)
この例では、一見不要な注釈を使用していますが、除外するフィールドには注釈が適用されていません。(APIを変更して必要な構成を少し簡素化するために、問題JACKSON-274の実装に投票することを躊躇しないでください。
同様のユースケースに対処するライブラリを作成しました。ユーザーがデータを要求したことに基づいて、プログラムでフィールドを無視する必要がありました。Jackson の通常のオプションは非常に扱いが難しく、コードの見た目が気に入らなかったのです。
ライブラリを使用すると、これが非常に理解しやすくなります。これにより、次のことが簡単にできます。
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.monitorjbl.json.JsonView;
import com.monitorjbl.json.JsonViewSerializer;
import static com.monitorjbl.json.Match.match;
//initialize jackson
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(JsonView.class, new JsonViewSerializer());
mapper.registerModule(module);
//get a list of the objects
List<MyObject> list = myObjectService.list();
String json;
if(user.getRole().equals('ADMIN')){
json = mapper.writeValueAsString(list);
} else {
json = mapper.writeValueAsString(JsonView.with(list)
.onClass(MyObject.class, match()
.exclude("*")
.include("name")));
}
System.out.println(json);
コードはGitHubで入手できます。お役に立てば幸いです。
2 つ以上の pojo でフィルターが定義されている場合は、これを試すことができます。
@JsonFilter("filterAClass")
class AClass
{
public String id = "42";
public String name = "Fred";
public String color = "blue";
public int sal = 56;
public BClass bclass = new BClass();
}
//@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
@JsonFilter("filterBClass")
class BClass
{
public String id = "99";
public String size = "90";
public String height = "tall";
public String nulcheck =null;
}
public class MultipleFilterConcept {
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper();
// Exclude Null Fields
mapper.setSerializationInclusion(Inclusion.NON_NULL);
String[] ignorableFieldNames = { "id", "color" };
String[] ignorableFieldNames1 = { "height","size" };
FilterProvider filters = new SimpleFilterProvider()
.addFilter("filterAClass",SimpleBeanPropertyFilter.serializeAllExcept(ignorableFieldNames))
.addFilter("filterBClass", SimpleBeanPropertyFilter.serializeAllExcept(ignorableFieldNames1));
ObjectWriter writer = mapper.writer(filters);
System.out.println(writer.writeValueAsString(new AClass()));
}
}
Jackson は、このようなほとんどのことを注釈に依存しています。ただし、値クラスに直接注釈を付ける必要はありません。「ミックスイン アノテーション」を使用することもできます ( http://www.cowtowncoder.com/blog/archives/2009/08/entry_305.htmlを参照)。
そして、基本的な@JsonIgnore
(プロパティごと) または@JsonIgnoreProperties
(クラスごと) を超えて使用できるいくつかのオプションがあります。http://www.cowtowncoder.com/blog/archives/2011/02/entry_443.htmlを参照