2014-03-05 4 views
1

Jackson은 항상 숫자를 Long 또는 Double로 구문 분석하려고합니다.잭슨 사용자 지정 번호 구문 분석

public class Foo { 
    private HashMap<String, ArrayList<HashMap<String, Object>>> tables; 

    ... 

} 

과 같은 보이는 일부 JSON :

{ "tables" : 
    { "table1" : 
     [ 
      { "t1Field1" : 0, 
       "t1Field2" : "val2" 
      }, 
      { "t1Field1" : 1, 
       "t1Field2" : "val4" 
      } 
     ] 
    } 
} 

잭슨이 정수로 t1Field1에 대한 값을 구문 분석/

본인은 해당 getter와 setter로 다음과 같은 클래스가 Longs 및 Floats/Doubles는 숫자의 크기에 따라 다릅니다. 그러나 나는 항상 Longs and Doubles를 원합니다.

저는 이것을 수행하기 위해 사용자 지정 디시리얼라이저 또는 파서를 작성해야한다는 것을 거의 확신합니다. 예제를 살펴 보았지만 내가 상상할 수있는 방식으로 작동하는 것은 발견하지 못했습니다. 난 그냥 기존의 잭슨 기능을 확장하고 번호에 대한 일이 무시됩니다. 나는 객체를위한 전체 디시리얼라이저를 작성하고 싶지 않다. 난 그냥 같은 것을하고 싶지 :

public class CustomerNumberDeserializer extends SomethingFromCoreJackson { 
    public Object deserialize() { 
     Object num; 
     num = super.deserialize(); 
     if (num instanceof Integer) 
      return Long.valueOf(((Integer)num).intValue()); 
     return num; 
    } 
} 

을하지만 확장 할 생각 모든 잭슨 클래스는 최종 또는 추상 중 하나였다 및 추가 작업의 무리를 요구하는 것 같았다. 내가 원하는 것은 가능한가?

답변

2

이 기사를 다시 읽은 후 확장하고 싶은 클래스를 찾았습니다. 희망이 사람을 도움이됩니다.

나는 다음과 같이 정의 디시리얼라이저를 만들어 :

/** 
* Custom deserializer for untyped objects that ensures integers are returned as longs 
*/ 
public class ObjectDeserializer extends UntypedObjectDeserializer { 

    private static final long serialVersionUID = 7764405880012867708L; 

    @Override 
    public Object deserialize(JsonParser jp, DeserializationContext ctxt) 
      throws IOException { 

     Object out = super.deserialize(jp, ctxt); 
     if (out instanceof Integer) { 
      return Long.valueOf((Integer)out).longValue(); 
     } 
     return out; 
    } 

    @Override 
    public Object deserializeWithType(JsonParser jp, DeserializationContext ctxt, 
      TypeDeserializer typeDeserializer) throws IOException { 

     Object out = super.deserializeWithType(jp, ctxt, typeDeserializer); 
     if (out instanceof Integer) { 
      return Long.valueOf((Integer)out).longValue(); 
     } 
     return out; 
    } 
} 

를 그리고 그것을 사용하는 내 객체 매퍼를 구성 :

ObjectMapper om = new ObjectMapper(); 
SimpleModule mod = new SimpleModule().addDeserializer(Object.class, new ObjectDeserializer()); 
om.registerModule(mod);