2017-10-09 31 views
0

我有這樣一個JSON:JSON標籤解碼成一個struct在Golang

{ 
"add":[{"id": "1234ABCD"}, {"id": "5678EFGH"}] 
} 

而且我有一個這樣的結構:

type ExampleStruct struct { 
    Added []string 
} 

我想知道什麼JSON標籤我應該把在我的結構,以便我做了JSON解碼(代碼未顯示在這裏),然後調用exampleStruct := &ExampleStruct其次是exampleStruct.Added,我怎麼能得到["1234ABCD", "5678EFGH"]

我試着這樣做:

type ExampleStruct struct { 
    Added []string `json:"add"` 
} 

但沒有奏效。

+0

如果只使用第一項的'id'數組,那麼該怎麼辦? 爲什麼不給'ExampleStruct'添加一個方法並獲取第一個項目。 –

+0

有可能有多個'id'可以從API調用中添加。爲了簡潔,我只是添加了一個。 –

+0

__不止一個可以添加_的ID,然後如果你調用'ExampleStruct.Added',你仍然得到第一個項目? –

回答

0

你試圖通過添加「身份證」,像這樣

型ExampleStruct結構來獲得其關鍵{ 添加[]字符串json:"add.id" }

+0

沒有我試過,但它不工作,因爲'ID'是包含在包含在數組中的對象中,而數組是JSON對象的'add'鍵的值。 –

0

使用地圖,而不是字符串的切片,因爲你有鍵值對的字符串。

type ExampleStruct struct { 
     Added []map[string]string `json:"add"` 
    } 

這是一個完整的例子:

package main 

    import (
     "bytes" 
     "encoding/json" 
     "fmt" 
    ) 

    func main() { 
     const code = `{ 
    "add":[{"id": "1234ABCD"}] 
    }` 
     type ExampleStruct struct { 
      Added []map[string]string `json:"add"` 
     } 
     var data ExampleStruct 
     json.NewDecoder(bytes.NewReader([]byte(code))).Decode(&data) 
     fmt.Println(data) 
    } 

編輯

既然你想擁有的地圖只值,這裏是一個完整的例子,其中Added是一個函數,可以在ExampleStruct上調用。它假定每個地圖僅包含兩個串(ID和值):

package main 

    import (
     "bytes" 
     "encoding/json" 
     "fmt" 
    ) 

    func main() { 
     const code = `{ 
    "add":[{"id": "1234ABCD"}, {"id": "5678EFGH"}] 
    }` 
     var data ExampleStruct 
     json.NewDecoder(bytes.NewReader([]byte(code))).Decode(&data) 
     fmt.Println(data) 
     fmt.Println(data.Added()) 
    } 

    type ExampleStruct struct { 
     Add []map[string]string `json:"add"` 
    } 

    func (e ExampleStruct) Added() []string { 
     values := make([]string, len(e.Add)) 
     for i := range e.Add { 
      for _, v := range e.Add[i] { 
       values[i] = v 
      } 
     } 
     return values 
    } 
0

爲了得到一個切片與ids,在結構上限定的方法,GetIds()例如:

package main 

import (
    "bytes" 
    "encoding/json" 
    "fmt" 
) 

type ExampleStruct struct { 
    Added []map[string]string `json:"add"` 
} 

func (ex *ExampleStruct) GetIds() []string { 
    res := make([]string, len(ex.Added)) 
    for _, v := range ex.Added { 
     res = append(res, v["id"]) 
    } 
    return res 
} 

func main() { 

    const code = `{ 
"add":[{"id": "1234ABCD"}, {"id": "5678EFGH"}] 
}` 
    var data ExampleStruct 
    json.NewDecoder(bytes.NewReader([]byte(code))).Decode(&data) 

    ids := data.GetIds() 
    fmt.Printf("%s\n",ids) 

} 
=> [ 1234ABCD 5678EFGH] 

https://play.golang.org/p/4zDQe5UPVc

0

您需要安排您的json這樣的一種方式,結構的元素應該可以直接訪問(不過度設計它)。

package main 

import (
    "bytes" 
    "encoding/json" 
    "fmt" 
) 

type ExampleStruct struct { 
    Add []struct { 
     ID string `json:"id"` 
    } `json:"add"` 
} 

func main() { 

    const code = `{ 
    "add":[{"id": "1234ABCD"}, {"id": "5678EFGH"}] 
    }` 

    var data ExampleStruct 
    json.NewDecoder(bytes.NewReader([]byte(code))).Decode(&data) 
    fmt.Println(data)   //Get all ids: {[{1234ABCD} {5678EFGH}]} 
    fmt.Println(data.Add[0].ID) //Get 1st ID : 1234ABCD 
    fmt.Println(data.Add[1].ID) //Get 2nd ID ... and so on.: 5678EFGH 
} 

您可以在這裏找到代碼https://play.golang.org/p/7tD4fLBewp

如果你在一個數組中有很多ids,那麼你也可以編寫一個函數來遍歷數組,例如data.Add並從中獲取id。