2012-09-27 3 views
0

jackson을 사용하여 json 객체 및 배열을 deserialize하는 데는 시간이 많이 걸렸지 만 이번에는 다음 객체에 대한 직렬화 해제 방법에 대해 머리를 감쌀 수 없습니다. . 어떻게, 잭슨 또는 기타 JSON 파싱 라이브러리, 직렬화와 수 : 목록, List<Test>지도를 사용하여 json 객체의 속성을 deserialize하는 방법

[ 
    { 
     "name": "x", 
     "elements": { 
      "key1": { 
       "name": "a", 
       "type": "b" 
      }, 
      "key2": { 
       "name": "a", 
       "type": "b" 
      } 
     } 
    }, 
    { 
     "name": "y", 
     "elements": { 
      "key3": { 
       "name": "a", 
       "type": "b" 
      } 
     } 
    } 
] 

, 테스트는 아래에 정의된다?

public class Test {  
    public class Element { 
     public String name; 
     public String type; 
     public String getName() { 
      return name; 
     } 
     public void setName(String name) { 
      this.name = name; 
     } 
     public String getType() { 
      return type; 
     } 
     public void setType(String type) { 
      this.type = type; 
     } 
    } 
    public String name; 
    public Map<String, Element> elements; 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public Map<String, Element> getElements() { 
     return elements; 
    } 
    public void setElements(Map<String, Element> elements) { 
     this.elements = elements; 
    } 
} 

마지막으로, 내 역 직렬화 코드 : 가능하지 않은 경우

public List<Test> test(final InputStream inputStream) { 
    List<Test> test = null; 
    try { 
     test = mapper.readValue(inputStream, new TypeReference<List<Test>>() { }); 
    } catch (final IOException e) { 
     log.error("Unable to deserialize json",e); 
    } 
    return test; 
    } 

는 어떤 객체 사실에 내 JSON을 역 직렬화 할 수 있습니까? 내가 미리 알 수없는 한 가지는 키의 이름입니다 (이 예에서 key1, key2, key3).

답변

1

그것은 다음과 같습니다

ObjectMapper mapper = new ObjectMapper(); 
List<Test> tests = mapper.readValue(jsonInput, new TypeReference<List<Test>>() { }; 

그것을 할 것입니다. 유일한 까다로운 부분은 일반적인 유형 정보를 전달하는 데 필요한 TypeReference입니다. 다른 libs 비슷한 접근법을 사용합니다 (GSON은 TypeToken 또는 등) 있습니다.

+0

이 방법을 사용하면 예외가 발생하지 않고 널 포인터가 반환됩니다. json 배열에서 "요소"를 제거하면 두 항목의 요소가 모두 null 인 테스트가 크기가 2로 올바르게 설정됩니다 (예상대로). – Lolo

+0

타다 !!! 문제는 Element가 Test 내부의 공용 클래스라는 사실에서 비롯된 것입니다. 대신 Class 요소를 별도의 파일로 작성하여 작동했습니다. 감사. 이 TypeReference를 더 잘 이해해야합니다. – Lolo

+0

아. 비 정적 인 내부 클래스는 외부 클래스의 인스턴스를 요구하기 때문에 문제가 될 수 있습니다 ("암시적인 부모 'this'포인터"). 따라서 일반적으로 사용할 내부 클래스는 '정적'으로 정의됩니다. – StaxMan

관련 문제