2017-03-11 1 views
1

내가 잭슨이 라이브러리를 사용하고 내가처럼 보이는 JSON 응답을 읽기 위해 노력하고 있어요에 반대합니다 :사용 잭슨은 JSON 문자열을 역 직렬화하거나 문자열 필드

{ "value":"Hello" } 

값이 비어, JSON 응답 외모를 같은 :

내 모델 POJO 클래스는이

public class Hello { 

    private String value; 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 

} 

문제 난 모양

{ "value":{} } 

{{} 값}, 잭슨이 개체를 읽으려고하지만, 내 모델 클래스 필드는 문자열입니다, 그래서 예외가 발생합니다 :

JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token. 

내 질문이 얼마나 잭슨이 성공적으로 할 수 있습니다를 응답이 보이는 때이야 응답은 다음과 같습니다 경우

{"value":"something"} 

동시에 : 같이 JSONs 읽어 { "값을": {}} (나 빈 응답), 내 안녕하세요 모델 클래스의 값 필드에 null을 전달합니다.

내가 JSON 문자열을 읽으려면 아래의 코드를 사용하고 있습니다 :

String myJsonAsString = "{...}"; 
ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(myJsonAsString , Hello.class); 
+0

추한 디자인 대신이 JSON을 생성하는 부분을 고칠 수있는 방법이 없습니까? –

+0

아니요, 불행히도 없습니다. API는 내 것이 아닙니다. 나는 단지 고객이다. –

+0

부적절합니다. 적절한 출력은 필드를 생략하거나 null로 설정합니다. – john16384

답변

3

는이 FELD에 대한 사용자 지정 디시리얼라이저를 사용할 수 있습니다. 여기에 문자열이있는 경우 문자열을 반환하거나 다른 경우에는 null을 반환합니다.

public class Hello { 

    @JsonDeserialize(using = StupidValueDeserializer.class) 
    private String value; 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 
} 

public class StupidValueDeserializer extends JsonDeserializer<String> { 
    @Override 
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { 
     JsonToken jsonToken = p.getCurrentToken(); 
     if (jsonToken == JsonToken.VALUE_STRING) { 
      return p.getValueAsString(); 
     } 
     return null; 
    } 
} 
+0

고마워요, 제 경우를 완벽하게 해결해줍니다. –