Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将字符串映射到json对象的多种类型?_Json_Go - Fatal编程技术网

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

将字符串映射到json对象的多种类型?,json,go,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"` }

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

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

要将JSON解组为接口值,请将JSON解组为接口值中包含的具体值。如果接口值为nil,即其中未存储任何具体值,则解组会在接口值中存储以下值之一:

bool,用于JSON布尔值
float64,用于JSON编号
字符串,用于JSON字符串
[]接口{},用于JSON数组
映射[string]接口{},用于JSON对象
nil表示JSON null

只需执行以下操作:

m := map[string]interface{}{"a":"apple", "b":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)
}

您的一个值也可以是数组吗
m:=map[string]接口{}{“a”:“apple”,“b”:2,“c”:[“foo”,2,“bar”,false,{“baz”:“bat”,“moreFoo”:7}]}
@BrantleyBeaird当然!空接口(
interface{}
)包含任何类型,包括数组。由于数组本身包含任意类型,因此它将成为类型
[]接口{}
接口类型(其中
接口{}
不指定任何方法)可以容纳任何底层类型,但这样会增加内存使用方面的运行时开销(附加类型信息在其值转换为接口值时存储)和一些处理。为获得动态语言的一些灵活性,您可能需要付出合理的代价,但在没有理由这样做的情况下不能使用。接口类型可以包含除其他接口类型之外的任何底层类型。这包括int、float64等普通类型,还包括数组、映射、通道等。如何它是正确的
m:=map[string][]接口{}{“a”:“apple”,“b”:2,“c”:[“foo”,2,“bar”,false,{“baz”:“bat”,“moreFoo”:7}]}
?@ErtuğrulAltınboğa I有点不清楚。对于复合文字(结构、数组、切片和映射),必须首先指定类型。它将是:
m:=map[string]接口{“a”:“apple”,“b”:2,“c”:接口{}{“foo”,2,“bar”,false,映射[字符串]接口{{“baz”:“bat”,“moreFoo”:7}}}