gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:38:37 25 4
gpt4 key购买 nike

我尝试从具有未定义数量的未知键值的 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)
}

更新

写成 flatten(可能起到魅力的作用)

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com