我正在编写一个简单的应用程序来测试使用 golang 模块“buger/jsonparser”解析 json。
我能够浏览 json 结构,直到按下具有数组值的键。我不知道如何提取数组并查看它是否包含某个字符串。
我的代码如下,当我尝试打印数组元素中的值时,它给我“未知值类型”。我试图从“actions”键获取数组,以便我可以查看它是否包含一些特定的字符串,例如“更新”。
jsonparser.ArrayEach(fileBytes, func(value []byte, _ jsonparser.ValueType, _ int, err error) {
if err != nil {
log.Fatal(err)
}
jsonparser.ArrayEach(value, func(action []byte, _ jsonparser.ValueType, _ int, err error) {
fmt.Println(jsonparser.GetString(action))
}, "change", "actions")
}, "resource_drift")
我正在尝试解析的 json 示例
"resource_changes": [
{
"address": "azurerm_application_insights.main",
"mode": "managed",
"type": "azurerm_application_insights",
"name": "main",
"provider_name": "registry.terraform.io/hashicorp/azurerm",
"change": {
"actions": ["update"],
}
}
]
import "encoding/json"
import "fmt"
jsonString := `"resource_changes": [
{
"address": "azurerm_application_insights.main",
"mode": "managed",
"type": "azurerm_application_insights",
"name": "main",
"provider_name": "registry.terraform.io/hashicorp/azurerm",
"change": {
"actions": ["update"],
}
}
]`
m := map[string]any{}
json.Unmarshal([]byte(jsonString), &m)
rc := m["resource_changes"].([]any)
first := rc[0].(map[string]any)
change := first["change"].(map[string]any)
fmt.Println(change)
你就快到了。您的实施有几个问题:
action
是一个字节数组,其中包含给定迭代时数组中的元素的字节。 (在本例中,它是 update
。)运行 jsonparser.GetString(action)
是不正确的,因为 action
不是字节数组中正确的 json 表示,即使是,您也没有提供正确的参数来获取字节数组中给定 json 表示形式内的路径。对于您的情况,您可以简单地使用 string(action)
resource_drift
不是正确的名称。应该是resource_changes
因此,考虑到这些,正确的实现应该如下所示:
jsonparser.ArrayEach(fileBytes, func(value []byte, _ jsonparser.ValueType, _ int, err error) {
if err != nil {
log.Fatal(err)
}
jsonparser.ArrayEach(value, func(action []byte, _ jsonparser.ValueType, _ int, err error) {
fmt.Println(string(action))
}, "change", "actions")
}, "resource_changes")