json - 在 Go 中从具有未知键值的 JSON 创建字符串映射

标签 json string dictionary go unmarshalling

我尝试从 JSON 创建一个字符串映射,其中包含未定义数量的未知键值。

这是我的示例 JSON 文件:

{
         "localhost":
        {
                "tag": "dev_latest",
                "vhost": "localhost.com"
        },
        "development":
        {
                "tag": "dev_latest",
                "vhost": "dev.com"
        }
}

我想创建一个 map[string]string ,其值如下:

config := map[string]string{
    "localhost-tag":      "dev_latest",
    "localhost-vhost": "localhost.com,
    "development-tag":   "dev_latest,
    ...
}

要使用已知值解析带有 "github.com/jmoiron/jsonq" 的 JSON 非常简单,但在这种情况下,localhost 可以是任何内容,并且 tag 可以是任何其他东西。

我的 Go 代码中的入口点是这样的:

func ParseJson(){
    configPath := GetConfigPath()
    b, err := ioutil.ReadFile(configPath) 

     //  Here, I need to create my map of strings..

    return configKeyStr

}

任何帮助将非常感激。

谢谢!

最佳答案

容易做。只需转换即可。

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

const s = `
{
         "localhost":
        {
                "tag": "dev_latest",
                "vhost": "localhost.com"
        },
        "development":
        {
                "tag": "dev_latest",
                "vhost": "dev.com"
        }
}
`

func main() {
    var m map[string]interface{}
    err := json.Unmarshal([]byte(s), &m)
    if err != nil {
        log.Fatal(err)
    }
    mm := make(map[string]string)
    for k, v := range m {
        mm[k] = fmt.Sprint(v)
    }
    fmt.Println(mm)
}

更新

写成扁平化(也许可以起到魅力)

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "reflect"
)

const s = `
{
         "localhost":
        {
                "tag": "dev_latest",
                "vhost": "localhost.com"
        },
        "development":
        {
                "tag": "dev_latest",
                "vhost": "dev.com"
        }
}
`

func flatten(m map[string]interface{}) map[string]string {
    mm := make(map[string]string)
    for k, v := range m {
        switch reflect.TypeOf(v).Kind() {
        case reflect.Map:
            mv := flatten(v.(map[string]interface{}))
            for kk, vv := range mv {
                mm[k+"-"+kk] = vv
            }
        case reflect.Array, reflect.Slice:
            for kk, vv := range m {
                if reflect.TypeOf(vv).Kind() == reflect.Map {
                    mv := flatten(vv.(map[string]interface{}))
                    for kkk, vvv := range mv {
                        mm[k+"-"+kkk] = vvv
                    }
                } else {
                    mm[k+"-"+kk] = fmt.Sprint(vv)
                }
            }
        default:
            mm[k] = fmt.Sprint(v)
        }
    }
    return mm
}

func main() {
    var m map[string]interface{}
    err := json.Unmarshal([]byte(s), &m)
    if err != nil {
        log.Fatal(err)
    }
    b, _ := json.MarshalIndent(flatten(m), "", "  ")
    println(string(b))
}

关于json - 在 Go 中从具有未知键值的 JSON 创建字符串映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44860050/

相关文章:

javascript - 有没有一种简单的方法可以将 Javascript 对象转换为 "name": "Fred", "value": "Blue" style pairs?

Javascript 字符串提取/正则表达式帮助

ios - 尝试在 Swift 中访问嵌套字典数组中的键

python - 拆分字符串而不丢失分隔符(及其计数)

ruby-on-rails - Ruby:如何从字符串中删除尾随反斜杠?

java - 如何将映射条目添加到 ArrayList?

swift - 向字典添加新键/值

android - 从 sdcard 读取一个 json 文件返回 - 空指针异常

c++ - 检查 boost 属性树中的值是树还是终端值

javascript - ajax成功时过滤json的Key值