2009-08-11 45 views
6

Tôi hiện đang deserializing JSON bằng cách sử dụng XStream và nó đã hoạt động rất tốt. Tuy nhiên, khi tôi có chuỗi JSON như sauXStream phân tích cú pháp JSON không có nút gốc

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

đáng chú ý nhất là nó không có nút gốc, tôi không chắc chắn cách phân tích cú pháp đó. Về cơ bản, tôi muốn đối diện của DROP_ROOT_NODE cho deserialization.

+0

Có vẻ như một cuộc trò chuyện đã diễn ra và điều này có ý nghĩa. nó dựa trên một trình phân tích cú pháp XML và XML phải chứa một nút gốc. Có vẻ như câu trả lời là "nó không thể". http://www.nabble.com/Serializing-JSON-with-no-root--td21732630.html –

Trả lời

4

Câu trả lời ngắn gọn là "bạn không thể".

XStream cần phải biết lớp nào để khởi tạo, nó nhận được kiến ​​thức đó từ dữ liệu JSON (hoặc XML). Tên lớp có thể được đặt bí danh, nhưng không thể bỏ qua. Bạn có thể làm việc xung quanh bằng cách:

  1. thủ gói chuỗi JSON của bạn với nút gốc có chứa tên lớp của bạn (hoặc bí danh)
  2. Viết reader của riêng bạn mà sẽ làm điều đó cho bạn. Tuy nhiên, trong trường hợp này, bạn vẫn cần chuyển tên lớp (bí danh) của bạn cho người đọc đó một cách rõ ràng hoặc theo quy ước (ví dụ như luôn luôn thêm 'root' nhưng sau đó cấu hình nó làm bí danh cho lớp của bạn trong cá thể XStream) - vì vậy tôi không 't nghĩ rằng đây là bất kỳ sạch hơn # 1.
+0

Bạn có thể cung cấp ví dụ về cách thực hiện tùy chọn 2 không? – portfoliobuilder

2

Sử dụng mã dưới đây:

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

Điều gì về việc đọc JSON mà không có nút gốc; có mã mẫu nào bạn có thể cung cấp không? – raffian

3

Tôi biết đây là một câu hỏi cũ, nhưng tôi sẽ gửi giải pháp của tôi sau một googling cả buổi sáng. Câu trả lời là cung cấp nút gốc giả (thẻ bắt đầu và kết thúc). Để thực hiện điều này, một trong những người bạn tốt nhất của bạn là SequenceInputStream:

Mã của tôi là như sau:

 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); 

Ở đây tôi đã trộn ba đối tượng InputStream, là những người đầu tiên và thứ ba những người cung cấp các yêu cầu các thẻ bị thiếu trong tệp được xử lý.

Giải pháp này được lấy cảm hứng từ số SO Question này. Hy vọng điều này sẽ giúp một ai đó.

Các vấn đề liên quan