2013-04-14 42 views
7

Tôi muốn deserialise một đối tượng trong đó bao gồm một mảng của một số giao diện Entity:unmarshal một mảng JSON của cấu trúc không đồng nhất

type Result struct { 
    Foo int; 
    Bar []Entity; 
}; 

Entity là một giao diện được thực hiện bởi một số loại struct. Dữ liệu JSON xác định loại cấu trúc có trường "loại" trong mỗi thực thể. Ví dụ.

{"type":"t1","field1":1} 
{"type":"t2","field2":2,"field3":3} 

Tôi làm cách nào để loại bỏ một cách chính xác. Từ những gì tôi có thể thấy, tôi phải:

  1. Thực hiện UnmarshalJSON trên Result.
  2. Phân tích cú pháp Bar dưới dạng []*json.RawMessage.
  3. Phân tích cú pháp mỗi thư thô dưới dạng map[string]interface{}.
  4. Kiểm tra trường "loại" trong thư thô.
  5. Tạo cấu trúc loại thích hợp.
  6. Phân tích cú pháp thư thô lần nữa, lần này vào cấu trúc vừa tạo.

Điều này nghe có vẻ rất tẻ nhạt và nhàm chán. Có cách nào tốt hơn để làm điều này? Hay tôi đang làm ngược lại, và có một phương pháp kinh điển hơn để xử lý một mảng các đối tượng không đồng nhất?

Trả lời

5

Tôi nghĩ rằng quá trình của bạn có thể phức tạp hơn một chút so với trước đây, hãy xem http://play.golang.org/p/0gahcMpuQc. Một giao diện [string] đơn {} sẽ xử lý rất nhiều điều đó cho bạn.

Ngoài ra, bạn có thể tạo ra một loại giống như

struct EntityUnion { 
    Type string 
    // Fields from t1 
    // Fields from t2 
    // ... 
} 

unmarshal vào đó; nó sẽ đặt chuỗi Kiểu và điền vào tất cả các trường mà nó có thể lấy từ dữ liệu JSON. Sau đó, bạn chỉ cần một chức năng nhỏ để sao chép các trường vào loại cụ thể.

+0

Tôi đã kết thúc với cấu trúc "công đoàn". Nó cảm thấy bẩn thỉu, nhưng cuối cùng cũng được giải phóng. –

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