programing

주석을 사용하지 않는 잭슨의 필드를 제외하려면 어떻게 해야 합니까?

bestprogram 2023. 3. 23. 23:13

주석을 사용하지 않는 잭슨의 필드를 제외하려면 어떻게 해야 합니까?

렌더링 전에 이름별로 일부 필드를 제외해야 합니다.필드 목록이 동적이어서 주석을 사용할 수 없습니다.

커스텀 시리얼라이저를 작성하려고 했지만 필드명을 취득할 수 없습니다.

GSON에서 사용한ExclusionStrategy하지만 잭슨은 그런 기능을 가지고 있지 않습니다.동등한 것이 있나요?

이름별로 필드를 제외하는 다음 예는 제 블로그 게시물인 Gson v Jackson - Part 4에서 볼 수 있습니다(검색:PropertyFilterMixIn.) 이 예에서는 다음 명령어를 사용하는 방법을 보여 줍니다.FilterProvider와 함께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를 변경하여 필요한 설정을 심플하게 하려면 , 주저하지 말고 JACKON-274의 실장에 투표해 주세요.

저는 비슷한 사용 사례에 대처하기 위해 도서관을 썼습니다.사용자가 데이터를 요청하는 필드를 프로그래밍 방식으로 무시해야 했습니다.일반적인 잭슨의 선택은 너무 강압적이었고, 나는 내 코드가 그렇게 보이는 것이 싫었다.

도서관은 이 모든 것을 훨씬 더 쉽게 이해할 수 있게 한다.다음과 같이 간단하게 할 수 있습니다.

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에서 사용할 수 있습니다. 도움이 되길 바랍니다!

두 개 이상의 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 참조

저는 Squiggly Filter라는 라이브러리를 작성했습니다.이것은 Facebook Graph API 구문의 서브셋에 근거해 필드를 선택합니다.예를 들어 사용자 객체의 주소 필드의 zipCode를 선택하려면 쿼리 문자열을 사용합니다.?fields=address{zipCode}Squiggly Filter의 장점 중 하나는 json을 렌더링하는 Object Mapper에 액세스할 수 있는 한 컨트롤러 메서드의 코드를 변경할 필요가 없다는 것입니다.

servlet API를 사용하는 경우 다음 작업을 수행할 수 있습니다.

1) 필터 등록

<filter> 
    <filter-name>squigglyFilter</filter-name>
    <filter-class>com.github.bohnman.squiggly.web.SquigglyRequestFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>squigglyFilter</filter-name>
    <url-pattern>/**</url-pattern> 
</filter-mapping>

2) Object Mapper 초기화

Squiggly.init(objectMapper, new RequestSquigglyContextProvider());

3) 이제 json을 필터링할 수 있습니다.

curl https://yourhost/path/to/endpoint?fields=field1,field2{nested1,nested2}

스퀴글리 필터에 대한 자세한 내용은 github에서 확인할 수 있습니다.

언급URL : https://stackoverflow.com/questions/13764280/how-do-i-exclude-fields-with-jackson-not-using-annotations