2013-06-11 2 views
3

여기서 null 값을 문자 그대로 "null" 문자열로 잘못 인코딩하면 레거시 서버에서 깨진 JSON을 처리해야합니다.Jackson : 기본 유형 비 직렬화를 재정의 하시겠습니까?

나는 이것을 이미 "수정"하기 위해 https://github.com/FasterXML/jackson-core/blob/master/src/main/java/com/fasterxml/jackson/core/base/ParserMinimalBase.java#L368을 덮어 쓰고 싶어한다는 것을 이미 알았지 만, 이것은 잭슨 내부에서 그렇게 차별화 된 것처럼 보인다. 대안이 있습니까, 예를 들어 ObjectMapper을 사용하여 String.class에 대한 사용자 정의 디시리얼라이저를 추가하거나 잃어 버렸습니까?

답변

1

좋아, 표준 String deserializer를 재정 의하여 작동합니다. 불행히도 org/codehaus/jackson/map/deser/std/StringDeserializer.java은 최종이며 확장 할 수 없기 때문에 전체 구현을 복사해야했습니다.

 
public class FixesModule extends SimpleModule { 

    public FixesModule() { 
     super(); 
     addDeserializer(String.class, new CustomStringDeserializer()); 
    } 
} 

 
public class CustomStringDeserializer extends StdScalarDeserializer { 

    private static final String NULL_STRING = "null"; 

    public CustomStringDeserializer() { 
     super(String.class); 
    } 

    @Override 
    public String deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { 
     JsonToken curr = jp.getCurrentToken(); 
     // Usually should just get string value: 
     if (curr == JsonToken.VALUE_STRING) { 
      // BEGIN NULL_STRING fix 
      if (NULL_STRING.equals(jp.getText())) { 
       return null; 
      } 
      // END NULL_STRING fix 
      return jp.getText(); 
     } 
     // [JACKSON-330]: need to gracefully handle byte[] data, as base64 
     if (curr == JsonToken.VALUE_EMBEDDED_OBJECT) { 
      Object ob = jp.getEmbeddedObject(); 
      if (ob == null) { 
       return null; 
      } 
      if (ob instanceof byte[]) { 
       return Base64Variants.getDefaultVariant().encode((byte[]) ob, false); 
      } 
      // otherwise, try conversion using toString()... 
      return ob.toString(); 
     } 
     // Can deserialize any scalar value, but not markers 
     if (curr.isScalarValue()) { 
      return jp.getText(); 
     } 
     throw ctxt.mappingException(_valueClass, curr); 
    } 

    // 1.6: since we can never have type info ("natural type"; String, Boolean, 
    // Integer, Double): 
    // (is it an error to even call this version?) 
    @Override 
    public String deserializeWithType(JsonParser jp, DeserializationContext ctxt, TypeDeserializer typeDeserializer) 
      throws IOException, JsonProcessingException { 
     return deserialize(jp, ctxt); 
    } 
} 
관련 문제