【问题标题】:Unmarshaling JSON top level array into map of string to string将 JSON 顶级数组解组为字符串到字符串的映射
【发布时间】:2017-02-17 22:30:59
【问题描述】:

我正在尝试解组以下类型的 JSON 数组:

[
{"abc's": "n;05881364"},
{"abcoulomb": "n;13658345"},
{"abcs": "n;05881364"}
]

转换成map[string]string。这个问题Golang parse JSON array into data structure 几乎回答了我的问题,但我的是一张真正的地图,而不是一组地图。解组为 []map[string]string 有效,但我现在得到了 map[string]string 的地图,而不是应有的 string 的简单 map

【问题讨论】:

  • 显示的 JSON 是一个映射数组,其中每个映射都有一个键/值对。如果您想从中创建map[string]string,则必须将其解组为一组地图,然后从中创建一个地图。
  • @AndySchweig 所以没有直接的方法吗?
  • @AndySchweig 我认为有更好的方法,而不是循环遍历每个地图元素并提取其键和值并添加到新地图中
  • 无论你解组到什么,都必须具有与 JSON 相同的结构。如果 JSON 应该是单个地图,为什么还要将其结构化为地图数组?

标签: arrays json go


【解决方案1】:

没有办法直接用json包做;您必须自己进行转换。这很简单:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    data := []byte(`
        [
        {"abc's": "n;05881364"},
        {"abcoulomb": "n;13658345"},
        {"abcs": "n;05881364"}
        ]
    `)

    var mapSlice []map[string]string
    if err := json.Unmarshal(data, &mapSlice); err != nil {
        panic(err)
    }
    resultingMap := map[string]string{}
    for _, m := range mapSlice {
        for k, v := range m {
            resultingMap[k] = v
        }
    }
    fmt.Println(resultingMap)
}

输出

map[abc's:n;05881364 abcoulomb:n;13658345 abcs:n;05881364]

【讨论】:

    【解决方案2】:

    Alex 的答案的替代方法(尽管非常相似)是定义您自己的类型以及 UnmarshalJSON 函数。

    package main
    
    import (
        "encoding/json"
        "fmt"
    )
    
    type myMapping map[string]string
    
    func (mm myMapping) UnmarshalJSON(b []byte) error {
        var temp []map[string]string
        if err := json.Unmarshal(b, &temp); err != nil {
            return err
        }
        for _, m := range temp {
            for k, v := range m {
                mm[k] = v
            }
        }
        return nil
    }
    
    func main() {
        data := []byte(`
                [
                    {"abc's": "n;05881364"},
                    {"abcoulomb": "n;13658345"},
                    {"abcs": "n;05881364"}
                ]`)
    
        resultingMap := myMapping{}
        if err := json.Unmarshal(data, &resultingMap); err != nil {
            panic(err)
        }
        fmt.Println(resultingMap)
    }
    

    Playground

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-15
      • 2012-01-23
      • 2018-05-29
      • 2016-10-15
      • 2013-06-15
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      相关资源
      最近更新 更多