如何用Golang的jsonparser遍历数组并检查指定字符串?
解决buger/jsonparser解析数组时的"Unknown value type"错误
问题根源
- 路径匹配错误:你的代码外层
ArrayEach用了"resource_drift"作为定位路径,但待解析JSON里的目标数组键是"resource_changes",这会导致找不到对应数组,触发类型错误。 - 内层遍历逻辑错误:你试图直接在
resource_changes的元素对象上调用ArrayEach并传入"change", "actions"路径,但ArrayEach的路径参数是用来定位当前value内的数组的,正确流程应该是先提取出change.actions数组,再对其遍历。
修正后的代码
package main import ( "fmt" "log" "github.com/buger/jsonparser" ) func main() { fileBytes := []byte(`{ "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"] } } ] }`) // 遍历resource_changes数组 err := jsonparser.ArrayEach(fileBytes, func(value []byte, _ jsonparser.ValueType, _ int, err error) { if err != nil { log.Fatal(err) } // 先提取change.actions数组 actionsArr, _, _, err := jsonparser.Get(value, "change", "actions") if err != nil { log.Fatal(err) } // 遍历actions数组并检查特定字符串 err = jsonparser.ArrayEach(actionsArr, func(action []byte, _ jsonparser.ValueType, _ int, err error) { if err != nil { log.Fatal(err) } actionStr, err := jsonparser.GetString(action) if err != nil { log.Fatal(err) } fmt.Println("当前action:", actionStr) // 检查是否包含目标字符串 if actionStr == "update" { fmt.Println("找到目标action: update") } }) if err != nil { log.Fatal(err) } }, "resource_changes") if err != nil { log.Fatal(err) } }
关键修正说明
- 把外层
ArrayEach的路径改为"resource_changes",确保定位到正确的数组。 - 先用
jsonparser.Get从resource_changes的元素对象中提取change.actions数组,再对这个数组调用ArrayEach遍历。 - 新增了检查特定字符串的逻辑,直接比较提取出的字符串即可完成判断。
内容的提问来源于stack exchange,提问作者Kevvv
相关产品推荐
相关产品推荐

