2014-09-17 3 views
3

null 리터럴 대신 속성에 대한 문자열로 "null"을 인쇄하는 webservice가 있습니다. 이것은 거의 모든 데이터 유형 (문자열 또는 날짜)에서이를 수행합니다. 예를 들어, 이상적인 경우에는Jackson에게 "null"문자열을 null 리터럴로 deserialize하는 방법

{ 
    "item" : { 
     "title": "Some title", 
     "expires": "2014-11-02 00:00:00" 
    } 
} 

를 반환하지만 때로는 반환 : "NULL"대신이 null로 설정하는 등의 제목 속성 값을 만드는

{ 
    "item" : { 
     "title": "null", 
     "expires": "2014-11-02 00:00:00" 
    } 
} 

합니다. 또는 언젠가이 :

에 dateformat가 일치하지 않기 때문에 직렬화 복원이 실패하게
{ 
    "item" : { 
     "title": "Some title", 
     "expires": "null" 
    } 
} 

. deserialization 중에 objectmapper를 구성하거나 내 모델 클래스에 주석을 달아 이러한 문제를 해결할 수 있습니까? 그것은 안드로이드 응용 프로그램의

@JsonInclude(JsonInclude.Include.NON_NULL) 
public class Item { 
    public String title; 
    @JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss") 
    public Date expires; 
} 

그래서 나는이 웹 서비스를 통해 제어 할 수 없습니다 : 같은

내 모델 클래스 보인다. 미리 감사드립니다.

+0

json으로는 값이 문자열 말한다 더 파서에 가고 없다 그렇지 않으면 그것을 고려하십시오. 사실, 문자열을 "null"과 비교하여 그에 따라 행동하는 코드를 추가하면됩니다. –

답변

1

사용자 정의 Deserializer을 사용하는 경우이를 수행 할 수 있지만 표준 주석을 사용하여 사용할 수 있다고는 생각하지 않습니다.

차입 및 http://www.baeldung.com/jackson-deserialization에서 일부 코드를 수정 :이 요구되는,하지만 당신은 ObjectMapper 사용하는 경우 다음과 같은 작업을 수행 할 수 있습니다

public class ItemDeserializer extends JsonDeserializer<Item> { 

    @Override 
    public Item deserialize(JsonParser jp, DeserializationContext ctxt) 
     throws IOException, JsonProcessingException { 
     JsonNode node = jp.getCodec().readTree(jp); 
     String title = null; 
     TextNode titleNode = (TextNode)node.get("title"); 
     if (! titleNode.toString().equals("null")) { 
      title = titleNode.toString(); 
     } 

     Date expires = null; 
     // similar logic for expires 

     return new Item(title, expires); 
    } 
} 
+0

JsonNode 등을 받아들이는 Item의 생성자를 작성하는 것이 더 쉽습니다. –

+0

아마 -하지만 이미 직렬화 주석으로 응용 프로그램 도메인 객체에 주석을 달고 있습니다. POJO 생성자에 직접 deserialization 논리를 추가하면 정말 부담 스럽습니다. – Dathan

+0

Item 클래스에는 약 30 개의 속성이 있고 프로젝트에는 다른 클래스가 거의 없습니다. 이것은 나를 위해 수용할만한 해결책이 아닙니다. 나는 좀 더 일반적인 해결책을 찾고 있었다. BeanDeserializerModifier가 될 수 있습니까? 또는 사용자 정의 널 탐지기? – Max

1

확실하지 경우는 :

1) @JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")를 제거합니다. 또한 입력 데이터를 보여준 방법에 대해 @JsonRootName을 추가했습니다.

@JsonRootName("item") 
@JsonInclude(JsonInclude.Include.NON_NULL) 
public class Item { 
    public String title; 
    public Date expires; 
    @Override 
    public String toString() { 
     return "Item{" + 
      "title='" + title + '\'' + 
      ", expires=" + expires + 
      '}'; 
    } 
} 

2) 그리고 사용하려는 DateFormat으로 ObjectMapper을 구성

public class Test { 
    private static final String T1 = "{\n"+ 
      " \"item\" : {\n"+ 
      "  \"title\": \"Some title\",\n"+ 
      "  \"expires\": \"2014-11-02 00:00:00\"\n"+ 
      " }\n"+ 
      "}"; 
    private static final String T2 = "{\n" + 
      " \"item\" : {\n" + 
      "  \"title\": \"null\",\n" + 
      "  \"expires\": \"2014-11-02 00:00:00\"\n" + 
      " }\n" + 
      "}"; 
    private static final String T3 = "{\n" + 
      " \"item\" : {\n" + 
      "  \"title\": \"Some title\",\n" + 
      "  \"expires\": \"null\"\n" + 
      " }\n" + 
      "}"; 

    public static void main(String[] args) throws IOException { 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); 
     mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:s")); 
     Item t1 = mapper.readValue(T1, Item.class); 
     Item t2 = mapper.readValue(T2, Item.class); 
     Item t3 = mapper.readValue(T3, Item.class); 
     System.out.println(t1); 
     System.out.println(t2); 
     System.out.println(t3); 
     System.out.println(mapper.writeValueAsString(t1)); 
     System.out.println(mapper.writeValueAsString(t2)); 
     System.out.println(mapper.writeValueAsString(t3)); 
    } 
} 

결과 : 여기

mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:s")); 

내가 테스트 전체 예이다. 마지막 출력은 @JsonInclude 출력에 영향을 미치는 방법을 보여줍니다, 어떻게이 구성이 완료되어 '널 (null)'입력 문자열 의 직렬화 :

Item{title='Some title', expires=Sun Nov 02 00:00:00 PDT 2014} 
Item{title='null', expires=Sun Nov 02 00:00:00 PDT 2014} 
Item{title='Some title', expires=null} 
{"title":"Some title","expires":"2014-11-02 00:00:0"} 
{"title":"null","expires":"2014-11-02 00:00:0"} 
{"title":"Some title"} 
관련 문제