2017-02-24 2 views
2

내 안심 테스트에서 Jackson을 사용하여 JSON을 역 직렬화하는 데 문제가 있습니다. JSON에는 String 배열이나 Boolean과 같은 객체가 될 수있는 키 "value"가 있습니다. 내가 2272204.2426 같은 숫자 값은 내가 노력 2272204.2 직렬화 복원되는 것으로 나타났습니다Jackson deserialize Double

public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { 
     ObjectCodec oc = jp.getCodec(); 
     JsonNode node = oc.readTree(jp); 
     if (node.isArray()) { 
      List<String> list = new ArrayList<>(); 
      for (JsonNode elementNode : node) { 
       list.add(oc.treeToValue(elementNode, String.class)); 
      } 
      return list; 
     } else { 
      if(node.isDouble()) { 
       return oc.treeToValue(node, Double.class); 
      } 
      else if(node.isBoolean()){ 
       return oc.treeToValue(node, Boolean.class); 
      } 
      else { 
       return oc.treeToValue(node, String.class); 
      } 
     } 
    } 

결국 :

{ 
"value": 2272204.2426 
} 

{ 
"value": ["value1", "value2"] 
} 

또는

그래서 나는이 분야에 대한 사용자 정의 디시리얼라이저를 썼다 Gson을 사용하여 그것을 desierialize하고 잘 작동합니다. 왜 Jackson을 사용하면 소수 부분이 부족한 지 알 수 있습니까? 코드를 디버깅하려고 시도했지만이 단계에서 JsonNode 노드 = oc.readTree (jp); 값은 2272204.2입니다.

답변

1

왜 잭슨에서 ObjectMapper을 사용하지 않습니까? ObjectCodec과 달리 DeserializationFeature을 추가 할 수 있습니다. Mapper는 실제로 코덱을 확장하지만 더 많은 기능을 제공합니다. 나는이 값 필드가 배열 또는 객체가 될 수 있음을 언급

+1

ObjectMapper mapper = new ObjectMapper(); mapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS); JsonNode node = //node where the value is defined as Double Double value = null; try { value = mapper.treeToValue(node, Double.class); } catch (IOException e) { e.printStackTrace(); } System.out.println(value); 

node.isDouble() 경우 위의 논리를 사용, 그게 내가 정의 디시리얼라이저를 사용하는 이유는 내가 =를 사용하여 (이 건설 @JsonDeserialize을 사용하고 있습니다 ValueDeserializer.class) private Object 값; 값은 내 대상 개체의 많은 필드 중 하나입니다. – baadnews

+0

답장을 보내 주셔서 감사합니다. 괜찮아. 저는 다른 경우에 JsonPath를 사용하여 특정 노드에서 객체를 검색 할 때 십진수 부분이 누락되었음을 확인했습니다. 안심 프로젝트의 쟁점 목록에 따르면 JsonPath (문자열)는 10 진수 값을 반올림합니다. – baadnews