如何在Golang中声明一个map列表

17

我不知道该如何在Golang中格式化结构体,以便我可以获得JSON格式的映射列表(键/值对)。到目前为止,我尝试了以下方式:

package main

import (
"encoding/json"
"fmt"
)

func main() {
map1 := map[string]interface{}{"dn": "abc", "status": "live", "version": 2, "xyz": 3}
map2, _ := json.Marshal(map1)
fmt.Println(string(map2))
}

这里只是打印键/值对...

{"dn":"abc","status":"live","version":2,"xyz":3}

但我需要输出类似于这样的内容:

[{"dn":"abc","status":"live"},{"version":2,"xyz":3}]


1
使用 map 切片。 - Volker
如果我理解正确的话,您需要一个JSON数组? - stevenferrer
是的。谢谢。如果您能提供一些示例代码,我可以继续进行。 - user2315104
@user2315104,看看这个https://gobyexample.com/json,不过我不确定你是否有特定的JSON结构想法。 - stevenferrer
谢谢。我尝试了这个,但是不知道如何定义映射列表,然后将值推入该结构中,以便在编码后可以获得JSON。 - user2315104
2个回答

33

根据@Volker的建议,您应该使用map片段:

package main

import (
    "fmt"
    "encoding/json"
)

// M is an alias for map[string]interface{}
type M map[string]interface{}

func main() {
    var myMapSlice []M

    m1 := M{"dn": "abc", "status": "live"}

    m2 := M{"version": 2, "xyz": 3}

    myMapSlice = append(myMapSlice, m1, m2)

    // or you could use `json.Marshal(myMapSlice)` if you want
    myJson, _ := json.MarshalIndent(myMapSlice, "", "    ")
    fmt.Println(string(myJson))
}

输出:

[
    {
        "dn": "abc",
        "status": "live"
    },
    {
        "version": 2,
        "xyz": 3
    }
]

从代码中,我使用了一个 map[string]interface{} 的别名来使初始化接口地图更加方便。

代码链接:https://play.golang.org/p/gu3xafnAyG


了不起,明白了。 - user2315104
9
以下是翻译的结果: 这是一个不需要额外类型的例子:myMapSlice := []map[string]interface{}{{"dn": "abc", "status": "live"},{"version": 2, "xyz": 3}}。 可在playground示例中查看。 - Charlie Tumahai

2

我曾经有同样的问题,后来自己回答了(在我的情况下没有使用struct

package main

import "fmt"

func main() {
    mapSlice := []map[string]interface{}{}

    map1 := map[string]interface{}{"foo": "bar"}
    mapSlice = append(mapSlice, map1)

    fmt.Println(mapSlice[0]["foo"]) // prints "bar"
}

https://go.dev/play/p/BOCVAOngul2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接