2012-11-17 4 views
0

내가처럼 보이는 잭슨과 JSON 문자열을 구문 분석을 시도하고있다 : 나는 Wrapper 또 다른 자바 클래스를 만들어 단순히 정수로 매핑하는 것을 방지하기 위해 노력하고자바 클래스에 JSON 매핑

{ 
    "name":"John", 
    "Wrapper":{ 
    "id":0 
    } 
} 

을 대신. 이것은 주로 컬렉션의 래퍼 XML 요소 을 생산하는 데 사용하기위한 것입니다

: 나는 문서 상태에도 불구하고 @XmlElementWrapper를 사용했습니다.

하지만 작동하지 않습니다. 여기

Exception in thread "main" org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.lang.Integer out of START_OBJECT token 
at [Source: [email protected]; line: 1, column: 15] (through reference chain: Test["Wrapper"]) 
    at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163) 
    at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:219) 
    at org.codehaus.jackson.map.deser.std.StdDeserializer._parseInteger(StdDeserializer.java:305) 
    at org.codehaus.jackson.map.deser.std.StdDeserializer$IntegerDeserializer.deserialize(StdDeserializer.java:795) 
    at org.codehaus.jackson.map.deser.std.StdDeserializer$IntegerDeserializer.deserialize(StdDeserializer.java:782) 
    at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299) 
    at org.codehaus.jackson.map.deser.SettableBeanProperty$FieldProperty.deserializeAndSet(SettableBeanProperty.java:579) 
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:697) 
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580) 
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2723) 
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1854) 
    at Test.main(Test.java:37) 

은 실행 가능한 예는 다음과 같습니다 : 나는 다음과 같은 예외가

@XmlAccessorType(XmlAccessType.FIELD) 
public class Test { 

    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException { 
     String json = 
       "{" + 
       "\"name\":\"John\","+ 
       "\"Wrapper\":{"+ 
       " \"id\":0}"+ 
       "}"; 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.setAnnotationIntrospector(new JaxbAnnotationIntrospector()); 
     mapper.setSerializationInclusion(Inclusion.NON_NULL); 
     Test test = mapper.readValue(json, Test.class); 
     System.out.println(test.toString()); 
    } 

    @XmlElement(name="name") 
    private String name; 

    @XmlElementWrapper(name="Wrapper") 
    @XmlElement(name="id") 
    private Integer wrapperId; 

    @Override 
    public String toString() { 
     return "Test [name=" + name + ", wrapperId=" + wrapperId + "]"; 
    } 

} 
+0

Jackson 이외의 JSON 바인딩 제공 업체에 관심이 있으시면 EclipseLink MOXy의'@ XmlPath' 주석을 사용하여 유스 케이스를 지원하는 방법을 보여주는 링크를 참조하십시오. http://blog.bdoughan.com/2011/08/ binding-to-json-xml-geocode-example.html –

답변

1

잭슨 구조의 제한된 수의이 사용 사례에 대한 주석 (@JsonUnwrapped, 루트 값 포장),하지만 뭔가를 변환합니다. 실제로이 특정 사용 사례에 대한 기능 요청이 있다고 생각합니다 (@JsonWrapped 내 생각입니다).

Jackson JAXB 주석 모듈은 주석을 인식하지만 JSON에는 사용되지 않습니다 (XML 백엔드에 사용되지만 Collection 및 배열 값 속성에 사용됨).

난 그냥 간단한 정적 클래스를 추가 할 것입니다 Wrapper; 또는 일반적인 관용어 인 경우 모든 종류의 래핑 된 값에 사용할 일반 제본 클래스 Wrapper<T>을 공유합니다. 코드의 양은 간단 할 것이고 객체 구조는 JSON 데이터 구조와 일대일로 매치 할 것이다.

+0

나는 수업을 만드는 일을 끝냈다. 지금까지 내가 실제로 만났던 유일한 사례였습니다. 나는해야 할 필요가없는 것처럼 보였습니다. 제안 해줘서 고마워. –

+0

데이터 바인딩에 대한 철학에 달려 있습니다. 일대일 매핑의 단순성보다 변환 함수를 사용하는 것이 더 나은지 여부입니다. 그것에 대해 생각할 두 가지 방법 중 한 가지. 이전에는 네, JSON과 모델간에이 임피던스를 해결할 것입니다. – StaxMan