32

我想创建一个可以转换为 json 对象的地图,例如

{
   "a": "apple",
   "b": 2
}

但是 golang 指定映射是用类型声明的,所以我可以有 map[string]string 或 map[string]int。如何创建像上面这样的 json 对象?

注意:直到运行时或需要创建 json 对象时,我才知道需要什么数据和/或类型。因此我不能只创建一个像

type Foo struct {
    A string `json:"a"`
    B int `json:"b"`
}
4

2 回答 2

61

您可以随时使用interface{}来存储任何类型。正如encoding/json包中的文档所说:

为了将 JSON 解组为接口值,Unmarshal 将 JSON 解组为接口值中包含的具体值。如果接口值为 nil,即其中没有存储具体值,则 Unmarshal 将其中之一存储在接口值中:

bool,对于 JSON 布尔值
float64,对于 JSON 数字
字符串,对于 JSON 字符串
[]interface{},对于 JSON 数组
map[string]interface{},对于 JSON 对象
nil 对于 JSON null

只需执行以下操作:

m := map[string]interface{}{"a":"apple", "b":2}
于 2013-08-30T06:18:14.153 回答
3

为了回应评论,我认为为 Map 和 Slice 添加类型定义更容易,然后您不必担心复杂的文字声明:

package main
import "fmt"

type Map map[string]interface{}
type Slice []interface{}

func main() {
   m := Map{
      "a": "apple",
      "b": 2,
      "c": Slice{"foo", 2, "bar", false, Map{"baz": "bat", "moreFoo": 7}},
   }
   fmt.Println(m)
}

https://golang.org/ref/spec#Type_definitions

于 2020-12-19T14:13:40.640 回答