gpt4 book ai didi

json - 将yaml转换为不带结构的json

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

Services: 
- Orders:
- ID: $save ID1
SupplierOrderCode: $SupplierOrderCode
- ID: $save ID2
SupplierOrderCode: 111111

我想将此 yaml 字符串转换为 json,因为源数据是动态的,所以我无法将其映射到结构:

var body interface{}
err := yaml.Unmarshal([]byte(s), &body)

然后我想再次将该接口(interface)转换为json字符串:

b, _ := json.Marshal(body)

但是出现错误:

panic: json: unsupported type: map[interface {}]interface {}

最佳答案

前言:我优化和改进了以下解决方案,并将其作为库发布在这里:github.com/icza/dyno .下面的 convert() 函数可用 dyno.ConvertMapI2MapS() .


问题是,如果您使用最通用的 interface{} 类型解码,github.com/go-yaml/yaml 使用的默认类型解码键值对的包将是 map[interface{}]interface{}

第一个想法是使用 map[string]interface{}:

var body map[string]interface{}

但是如果 yaml 配置的深度超过一个,这种尝试就会失败,因为这个 body 映射将包含额外的映射,其类型将再次是 map[interface{}]interface {}

问题是深度未知,可能还有maps以外的值,所以用map[string]map[string]interface{}不好。

一个可行的方法是让 yaml 解码为 interface{} 类型的值,然后递归遍历结果,然后转换每个遇到 map[interface{}]interface{}map[string]interface{} 值。 map 和 slice 都必须处理。

下面是这个转换器函数的一个例子:

func convert(i interface{}) interface{} {
switch x := i.(type) {
case map[interface{}]interface{}:
m2 := map[string]interface{}{}
for k, v := range x {
m2[k.(string)] = convert(v)
}
return m2
case []interface{}:
for i, v := range x {
x[i] = convert(v)
}
}
return i
}

并使用它:

func main() {
fmt.Printf("Input: %s\n", s)
var body interface{}
if err := yaml.Unmarshal([]byte(s), &body); err != nil {
panic(err)
}

body = convert(body)

if b, err := json.Marshal(body); err != nil {
panic(err)
} else {
fmt.Printf("Output: %s\n", b)
}
}

const s = `Services:
- Orders:
- ID: $save ID1
SupplierOrderCode: $SupplierOrderCode
- ID: $save ID2
SupplierOrderCode: 111111
`

输出:

Input: Services:
- Orders:
- ID: $save ID1
SupplierOrderCode: $SupplierOrderCode
- ID: $save ID2
SupplierOrderCode: 111111

Output: {"Services":[{"Orders":[
{"ID":"$save ID1","SupplierOrderCode":"$SupplierOrderCode"},
{"ID":"$save ID2","SupplierOrderCode":111111}]}]}

需要注意的一件事:通过 Go 映射从 yaml 切换到 JSON,您将失去项目的顺序,因为 Go 映射中的元素(键值对)没有排序。这可能是也可能不是问题。

关于json - 将yaml转换为不带结构的json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40737122/

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