要在Golang中解码为结构的JSON标记

时间:2017-10-09 11:17:39

标签: json go struct

我有一个像这样的JSON:

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

我有一个像这样的结构:

type ExampleStruct struct {
    Added   []string
}

我想知道我应该在我的结构中添加什么JSON标记,以便在我执行JSON解码(代码未在此处显示)然后调用exampleStruct := &ExampleStruct后跟exampleStruct.Added时,我该怎样才能获得{ {1}}?

我试过这样做:

["1234ABCD", "5678EFGH"]

但它不起作用。

4 个答案:

答案 0 :(得分:0)

您是否尝试通过添加'id'来获取其密钥,就像这样

type ExampleStruct struct {     添加了[]字符串json:"add.id" }

答案 1 :(得分: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和value):

    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
    }

答案 2 :(得分: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

答案 3 :(得分: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。