【问题标题】:Mapping strings to multiple types for json objects?将字符串映射到json对象的多种类型?
【发布时间】:2013-08-30 06:02:41
【问题描述】:

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


    【解决方案1】:

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

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

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

    只需执行以下操作:

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

    【讨论】:

    • 你的值也可以是一个数组吗? m := map[string]interface{}{"a":"apple", "b":2, "c": ["foo", 2, "bar", false, {"baz": "bat", "moreFoo": 7}]}
    • @BrantleyBeaird 当然!空接口 (interface{}) 包含任何类型,包括数组。由于您的数组本身包含任意类型,因此它将成为类型 []interface{}
    • 接口类型(其中interface{} 是不指定方法的一种)可以保存任何底层类型,但因此它们在内存使用方面增加了运行时开销(附加类型信息存储在它的那一刻)值转换为接口值)和一些处理。为您可能习惯于动态语言的一些灵活性付出合理的代价,但在没有理由这样做时不可用。接口类型可以包含任何基础类型,除了另一个接口类型。这包括普通类型,如 int、float64,还包括数组、地图、通道等。
    • 如何正确处理m := map[string][]interface{}{"a":"apple", "b":2, "c": ["foo", 2, "bar", false, {"baz": "bat", "moreFoo": 7}]}
    • @ErtuğrulAltınboğa 我有点不清楚。对于复合文字(结构、数组、切片和映射),您必须首先指定类型。应该是:m := map[string]interface{}{"a": "apple", "b": 2, "c": []interface{}{"foo", 2, "bar", false, map[string]interface{}{"baz": "bat", "moreFoo": 7}}}
    【解决方案2】:

    为了响应cmets,我觉得给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

    【讨论】:

      猜你喜欢
      • 2019-01-25
      • 2018-02-10
      • 2022-01-03
      • 2015-07-30
      • 2018-05-29
      • 1970-01-01
      • 2023-03-12
      • 2017-12-24
      • 1970-01-01
      相关资源
      最近更新 更多