2012-09-22 1 views
3

Jackson 1.9.9는 스칼라 값 (bool, int, string)으로 구문 분석 할 때 다소 일치하지 않습니다. 모든 배열 또는 객체 유형이 실패하지만 임의의 스칼라 유형을 문자열에 넣을 수 있습니다. bool 0 및 0이 아닌 경우 false/true로 매핑됩니다. int 속성은 숫자 만 허용합니다. 누군가가 예를 들어 문자열 속성에 부울 값을 전달하면 오류가 생긴다 있도록 jackson에 대해 엄격한 형식 구문 분석을 사용 설정하는 방법은 무엇입니까?

public class Foo { public String s; public boolean b; public int i; } 

ObjectMapper mapper = new ObjectMapper(); 
System.out.println(mapper.readValue("{\"s\":\"abc\"}", Foo.class).s); // "abc" 
System.out.println(mapper.readValue("{\"s\":true}", Foo.class).s); // "true" 
System.out.println(mapper.readValue("{\"s\":123}", Foo.class).s); // "123" 
System.out.println(mapper.readValue("{\"b\":123}", Foo.class).b); // true 
System.out.println(mapper.readValue("{\"b\":0}", Foo.class).b); // false 
System.out.println(mapper.readValue("{\"b\":\"abc\"}", Foo.class).b); // fails with JsonMappingException 
System.out.println(mapper.readValue("{\"i\":\"abc\"}", Foo.class).i); // fails with JsonMappingException 
System.out.println(mapper.readValue("{\"i\":true}", Foo.class).i); // fails with JsonMappingException 
System.out.println(mapper.readValue("{\"s\":[]}", Foo.class).s); // fails with JsonMappingException 
System.out.println(mapper.readValue("{\"s\":{}}", Foo.class).s); // fails with JsonMappingException 
System.out.println(mapper.readValue("{\"b\":[]}", Foo.class).b); // fails with JsonMappingException 
System.out.println(mapper.readValue("{\"b\":{}}", Foo.class).b); // fails with JsonMappingException 
System.out.println(mapper.readValue("{\"i\":[]}", Foo.class).i); // fails with JsonMappingException 
System.out.println(mapper.readValue("{\"i\":{}}", Foo.class).i); // fails with JsonMappingException 

잭슨의 엄격 모드이 있습니까?

JAX-RS 프로젝트에서 이것을 사용하고 있는데, 대부분의 오류는 있지만 전부는 아니기 때문에 Jackson이 던진 예외를 기반으로 오류보고가 이루어집니다. 원시 ObjectNode를 얻지 않고 모든 것을 수동으로 검사하는 것을 피하고 싶습니다. 호출자가 문자열에 대한 부울을 전달하면 프로그래밍 오류가 발생했을 가능성이 높으므로 그에게 말하고 싶습니다.

답변

1

Jackson 데이터 바인딩은 더 많은 자동 강제 변환을 허용하기 위해 시간이 지남에 따라 증가했으며 더 엄격한 검사를 시행하는 몇 가지 기능 (DeserializationConfig.Feature.FAIL_ON_NULL_FOR_PRIMITIVES)이 있지만 요청 된 항목이 많지 않습니다.

이렇게 주어진 경우 boolean/Boolean과 같이 엄격한 유형으로 사용자 정의 JsonDeserializer을 등록하는 것이 가장 좋습니다. 더 엄격한 검사를 수행 할 수 있습니다.

또한 엄격한 제한 사항에 대한 기능을 요청할 수 있습니다. 일부 유스 케이스에서는이 기능이 유용하다고 생각합니다. 느슨한 전환이 실제 문제를 숨길 수 있다면

+1

Java 용 기본 JSON 솔루션이 그렇게 잘못 될 수있는 방법은 무엇입니까? –

+0

@ polkovnikov.ph 많은 프로그래밍 언어에 실제 부울 유형이 없거나 JSON 이외의 다른 값을 사용하는 경우/true 일 경우 불량이라고 간주되는 것은 다른 사용자가 상호 운용성에 매우 유용하다고 간주됩니다. false' 비슷한 개념. 엄격한 실패는 일부 사용자가 원하지만 뭔가 다른 사람이 성 가시고, 불행하게도 발견 할 수 있습니다. – StaxMan

+0

고려 사항은 주관적입니다. [암시 적 주조는 유해하다고 생각했습니다] (http://programmers.stackexchange.com/questions/284937/why-cant-there-be-any-implicit-conversions) 오래 전. 어떤 사용자는 암시 적 캐스트의 유용성에 대해 어떻게 생각 하든지 오류를 유발합니다. 부울 유형이없는 언어 (또는 여러 개의 부울 유형이있는 언어)의 경우 명시 적 변환 주석이 유일한 올바른 방법입니다. Jackson과 관련된 문제는 이러한 변환 중 일부가 불일치하게 구현된다는 것입니다. 그렇지 않으면 전체 형식에 대해 serializer가 필요하며 이는 그것이 내가 잘못 행동 한 이유입니다. –

관련 문제