41

レンダリングする前に、いくつかのフィールドを名前で除外する必要があります。フィールドのリストは動的なので、注釈を使用できません。

カスタムシリアライザーを作成しようとしましたが、フィールド名を取得できません。

GSON では を使用しましExclusionStrategyたが、Jackson にはそのような機能はありません。同等のものはありますか?

4

5 に答える 5

42

以下の名前でフィールドを除外する例は、私のブログ投稿、Gson vJackson-Part4からのものです。(を検索しPropertyFilterMixInます。)この例は、ユーザー指定のフィールド名のリストにaFilterProviderSimpleBeanPropertyFilter使用する方法を示しています。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の実装に投票することを躊躇しないでください。

于 2012-12-09T22:47:10.373 に答える
14

同様のユースケースに対処するライブラリを作成しました。ユーザーがデータを要求したことに基づいて、プログラムでフィールドを無視する必要がありました。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で入手できます。お役に立てば幸いです。

于 2015-06-20T20:31:11.490 に答える
10

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())); 

      }
}
于 2014-09-29T06:52:01.083 に答える
6

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を参照

于 2012-12-10T20:40:27.990 に答える