【问题标题】:How to decode json in Go如何在 Go 中解码 json
【发布时间】:2017-07-26 16:26:19
【问题描述】:

我有一个像这样的 json

[{"name":"Name1","age":20},{"name":"Name2","age":29}]

我想把它解码成这样的地图

map[map["name":"Name1" ....] ,map["name":"Name2",....]]

就我而言,我的逻辑如下所示

bt:= []byte(metadatas[0])
var dat interface{}
if err := json.Unmarshal(bt, dat); err != nil {
    panic(err)
}
fmt.Println(dat)

作为回应,我得到了

[map["name":"Name1" ....] ,map["name":"Name2",....]]

我怎样才能得到地图而不是

【问题讨论】:

标签: json dictionary go


【解决方案1】:

解组的目标数据结构可以定义为val := []map[string]interface{}{}:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    input := []byte(`[{"name":"Name1","age":20},{"name":"Name2","age":29}]`)
    val := []map[string]interface{}{}
    if err := json.Unmarshal(input, &val); err != nil {
        panic(err)
    }
    fmt.Printf("%v\n", val)
}

Go Playgroung

这给了我们一张地图。如果您想将这些地图放在另一个地图中,则该地图的元素应该有一个键(例如它们在切片中的索引)。

【讨论】:

    【解决方案2】:

    根据定义,map 是一种数据结构,它使用一些预定义的键来保持对特定值的引用。

    在您的情况下,您有一个称为集合(地图数组)的数据结构。如果要将集合项保留为另一个映射值,实现此目的的最简单方法是使用数组(集合)的索引作为键将集合转换为映射。

    但是我不确定您是否能够在您的 json.Unmarshal 期间直接执行此操作而不应用一些额外的转换

    【讨论】:

      【解决方案3】:

      我已经解决了这个问题,这是我的逻辑

      type Meta struct {
          Name string `json:"name"`
          Age int `json:"age"`
      }
      
      type Metadata struct {
          Collection []Meta
      }
      
      
      bt:= []byte(metadatas[0])
      dat := make([]Meta, 0)
      if err := json.Unmarshal(bt, &dat); err != nil {
          panic(err)
      }
      

      作为回应,我得到了带有对象的数组

      【讨论】:

        猜你喜欢
        • 2020-12-15
        • 1970-01-01
        • 2018-05-05
        • 2019-01-13
        • 1970-01-01
        • 2016-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多