2013-01-17 1 views
1

문자열 만 포함하도록하려는 JSON 배열이 있습니다. Jackson은 정수와 날짜를 암시 적으로 문자열로 변환합니다. JSON 배열의 모든 요소가 사실 문자열인지 확인하고 싶습니다.Jackson JSON 매퍼가 암시 적으로 String으로 캐스팅하는 것을 중단하려면 어떻게해야합니까?

Object[] badModuleArray = new Object[]{"case", 1, 2, "employee", new Date()}; 

    ObjectMapper objectMapper = new ObjectMapper(); 
    String jsonModules = objectMapper.writeValueAsString(badModuleArray); 

    try 
    { 
     TypeFactory typeFactory = TypeFactory.defaultInstance(); 
     mapper.readValue(modules, typeFactory.constructCollectionType(List.class, String.class)); 
    } 
    catch(IOException e) 
    { 
     logger.error("something other than strings in JSON object"); 

    } 

위의 예에서 ObjectMapper는 정수, 날짜 등을 문자열로 변환하지 않습니다. JSON 배열의 각 요소가 문자열이 아닌 경우 예외가 throw되기를 원합니다. 이것이 가능한가?

답변

2

여러분이 List<String>을 원한다고 말했기 때문에 Jackson은 각 객체를 문자열로 캐스팅하고 있습니다. ["case",1,2,"employee",1358444552861]의 JSON에 대한

List list = objectMapper.readValue(jsonModules, typeFactory.constructCollectionType(List.class, Object.class)); 
for (Object item : list) { 
    System.out.println(item + " is a: " + item.getClass()); 
    if (!(item instanceof String)) { 
     System.out.println("Not a string!"); 
    } 
} 

내가 얻을 :

그 중 하나가 문자열이 아닌 경우

대신 오류가 발생하는 목록 자신의 내용을 List<Object> 잭슨을 요청하고 검토

case는 다음과 같습니다. class java.lang.String
1은 다음과 같습니다. class java.lang.Integer
문자열이 아닙니다!
2는 다음과 같습니다. class java.lang.Integer
문자열이 아닙니다!
직원은 다음과 같습니다. class java.lang.String
1358444552861은 다음과 같습니다. class java.lang.Long
문자열이 아닙니다!

+0

올바른 내용입니다. 또 다른 가능성은'@JsonDeserialize (contentUsing = MyValueDeserializer.class)'를 사용하여 맞춤 컨텐츠 디시리얼라이저를 추가하여 검사를 수행하는 것입니다. – StaxMan

관련 문제