将字符串映射到json对象的多个类型?

时间:2013-08-30 06:02:41

标签: json go

我想创建一个可以转换为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"`
}

2 个答案:

答案 0 :(得分:34)

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

  

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

     布尔,对于JSON布尔人来说   float64,用于JSON号码   字符串,用于JSON字符串
  [] interface {},用于JSON数组
  map [string] interface {},用于JSON对象
  n为JSON null

请执行以下操作:

m := map[string]interface{}{"a":"apple", "b":2}

答案 1 :(得分:2)

回复评论,我觉得给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