2014-11-28 22 views
5

Bu yüzden Go'ya bir şans daha vermeye karar verdim ama takıldım. belgelerinde çoğu Go yapı örnekleri çok basit ve ben Git yapılar ile temsil etmek nasıl bilmiyorum aşağıdaki JSON nesnesi gösterimi bulundu: Eğer daha deneyimli sincaplar, temsil edeceğini NasılBu karmaşık veri yapısını Go yapıları ile nasıl gösterebilirim?

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

o biraz garip veri Go? Ve ortaya çıkan yapının iç içe geçmiş öğeleri nasıl başlatılır?

cevap

12

params özelliği için json.RawMessage dilimini kullanıyorum. Daha sonra bunları tümüyle çözen bir GetXXX yönteminin arkasına saklayın. Numune (hızlı öğle anda birlikte çökerttiğini)

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" 

Çalışma: Biraz böyle .. http://play.golang.org/p/Gp7UKj6pRK

ikinci param sizden giriş gerekecektir O ancak temelde bir dilim Çözümün bakıyoruz onu temsil etmek için oluşturduğunuz türden.

+0

Bir Python'dan gelen PHP | JS | Lua arka planı bu çok basit bir şey yapmak için çok fazla kod gibi görünüyor. Birisi gerçekten Go xD'yi düzeltmek zorunda. Neyse cevabını beğendim: Yaptığımdan çok daha iyi. Teşekkür ederim. – marcio

+0

JSON nesnesi çok tuhaf olduğu için sadece bir çok kod. Bir öğenin bir nesne olduğu bir dizi ... ama diğer öğenin kendisi bir dizidir? Çoğu sistem tasarımında bunu göremiyorum. Eğer sisteminizde buna sahipseniz .. Seni hiç kıskanıyorum. –

+0

Benim hatam değil. Evimde birkaç elektronik cihazı entegre etmek için bir uygulama üzerinde çalışıyorum ve bazı cihazlarda garip API'ler var, bunların bir kısmı SOAP gömülü sunucularında daha da kötü. Her neyse, Python, PHP, Javascript veya Lua ile bu veri yapısını haritalamak oldukça kolay. Go ile şaşırtıcı derecede düz olmayan, bu garip çünkü Go ile yapmaya çalıştığım hemen hemen her şey pasta gibi kolay oldu. – marcio

İlgili konular