2014-11-28 16 views
5

Vì vậy, tôi quyết định cho Go một cơ hội khác nhưng bị mắc kẹt. Hầu hết các ví dụ Go struct trong tài liệu rất đơn giản và tôi thấy các đối tượng ký hiệu JSON sau mà tôi không biết làm thế nào để biểu diễn với Go struct:Làm thế nào để biểu diễn cấu trúc dữ liệu phức tạp này với cấu trúc Go?

{ 
    id: 1, 
    version: "1.0", 
    method: "someString", 
    params: [ 
     { 
      clientid: "string", 
      nickname: "string", 
      level: "string" 
     }, 
     [{ 
      value: "string", 
      "function": "string" 
     }] 
    ] 
} 

Làm thế nào bạn, Gophers nhiều kinh nghiệm hơn, đại diện cho rằng dữ liệu hơi lạ trong Go? Và làm thế nào để khởi tạo các phần tử lồng nhau của cấu trúc kết quả?

Trả lời

12

Tôi sẽ sử dụng một lát json.RawMessage cho thuộc tính params .. sau đó ẩn chúng sau phương thức GetXXX giải mã tất cả độc đáo. Hơi như thế này:

type Outer struct { 
    Id  int    `json:"id"` 
    Version string   `json:"version"` 
    Method string   `json:"method"` 
    Params []json.RawMessage `json:"params"` 
} 

type Client struct { 
    ClientId string `json:"clientid"` 
    Nickname string `json:"nickname"` 
    Level string `json:"level"` 
} 

.... 

obj := Outer{} 

err := json.Unmarshal([]byte(js), &obj) 

if err != nil { 
    fmt.Println(err) 
} 

fmt.Println(obj.Method) // prints "someString" 

client := Client{} 

err = json.Unmarshal(obj.Params[0], &client) 

fmt.Println(client.Nickname) // prints "string" 

làm việc (một cách nhanh chóng đập tan cùng nhau vào giờ ăn trưa) mẫu: http://play.golang.org/p/Gp7UKj6pRK

Đó thứ hai param sẽ cần một số thông tin từ bạn .. nhưng bạn về cơ bản nhìn vào giải mã nó vào một lát của bất kỳ loại nào bạn tạo ra để đại diện cho nó.

+0

Đến từ một từ một Python | PHP | JS | Lua nền này trông giống như rất nhiều mã chỉ để làm một điều rất đơn giản. Ai đó thực sự cần phải sửa chữa Go xD Dù sao, tôi thích câu trả lời của bạn: nó tốt hơn nhiều so với những gì tôi đã làm. Cảm ơn bạn. – marcio

+0

Chỉ có rất nhiều mã của nó vì đối tượng JSON rất lạ. Một mảng trong đó một mục là một đối tượng ... nhưng mục kia chính nó là một mảng? Tôi không thể thấy điều đó xảy ra trong hầu hết các thiết kế hệ thống. Nếu bạn có điều này trong hệ thống của bạn .. Tôi không ghen tị với bạn cả. –

+0

Không phải lỗi của tôi. Tôi đang làm việc trên một ứng dụng để tích hợp một vài thiết bị điện tử trong nhà của tôi và một số thiết bị có API lạ, một số thiết bị thậm chí còn tệ hơn với các máy chủ nhúng SOAP của họ. Dù sao, với Python, PHP, Javascript hoặc Lua nó khá dễ dàng để ánh xạ cấu trúc dữ liệu này. Với Go nó là đáng ngạc nhiên không thẳng về phía trước, đó là lạ bởi vì hầu như tất cả mọi thứ tôi đã cố gắng để làm với Go đã được dễ dàng như chiếc bánh. – marcio

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