2009-08-11 2 views
6

현재 XStream을 사용하여 JSON을 deserialize하고 있으며, 잘 작동하고 있습니다. 나는 다음과 같은XStream은 루트 노드가없는 JSON을 파싱합니다.

{ 
    key1: { an_object: { something: 'foobar' } }, 
    key2: { another_object: { data: 'hi' } 
} 

같은 JSON 문자열을 가질 때, 특히 그것이 루트 노드가없는, 나는 그것을 구문 분석하는 방법을 모르겠어요. 기본적으로, 나는 deserialization을 위해 DROP_ROOT_NODE의 반대를 원한다.

+0

대화가 진행되고있는 것처럼 보입니다. XML 구문 분석기를 기반으로하며 XML에는 루트 노드가 있어야합니다. 답은 "할 수 없다"는 것처럼 보입니다. http://www.nabble.com/Serializing-JSON-with-no-root--td21732630.html –

답변

4

짧은 대답은 "할 수 없다"입니다.

XStream은 인스턴스화 할 클래스를 알아야 JSON (또는 XML) 데이터에서 해당 지식을 가져옵니다. 클래스 이름은 별명을 지정할 수 있지만 생략 할 수는 없습니다. 다음과 같은 방법으로 해결할 수 있습니다

  1. 가 수동으로 클래스 이름 (또는 별명)을 포함하는 루트 노드 당신을 위해 그것을 할 것입니다 자신의 독자를 작성
  2. 와 JSON 문자열을 포장. 그러나이 경우 명시 적으로나 관습에 따라 클래스 이름 (별칭)을 해당 판독기에 전달해야합니다 (예 : 항상 'root'앞에 붙이지 만 XStream 인스턴스에서 클래스의 별칭으로 구성). 그래서 이것이 # 1보다 깨끗하다고 ​​생각하지 않습니다.
+0

옵션 2를 수행하는 방법에 대한 예를 제공 할 수 있습니까? – portfoliobuilder

2

는 아래의 코드를 사용하여

XStream xstream = new XStream(new JsonHierarchicalStreamDriver() { 
    public HierarchicalStreamWriter createWriter(Writer writer) { 
     return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE); 
    } }); 
+0

루트 노드없이 JSON을 읽는 것은 어떨까요? 거기에 샘플 코드가 있습니까? – raffian

3

나는이 오래된 질문 알아요,하지만 난 모든 아침 인터넷 검색 후 내 솔루션을 게시 할 수 있습니다. 대답은 더미 루트 노드 (시작 및 종료 태그)를 제공하는 것입니다.

내 코드는 다음과 같다 :이를 위해, 당신의 가장 친한 친구 중 하나을 SequenceInputStream이다 나는 그가 제공하는 첫 번째와 세 번째 사람되고, 세 가지의 InputStream 객체를 혼합 한 다음

 reader = new XppDriver().createReader(new SequenceInputStream(
     Collections.enumeration(Arrays.asList(
     new InputStream[] { 
       new ByteArrayInputStream("<PlatformAuditEvents>".getBytes()), 
       new FileInputStream(file), 
       new ByteArrayInputStream("</PlatformAuditEvents>".getBytes()) 
      })) 
    )); 
    in = xstream.createObjectInputStream(reader); 

필요한 처리 된 파일에서 누락 된 태그

이 해결책은이 SO Question에서 영감을 받았습니다. 희망이 사람을 도움이됩니다.

관련 문제