You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Golang的jsonparser遍历数组并检查指定字符串?

解决buger/jsonparser解析数组时的"Unknown value type"错误

问题根源

  1. 路径匹配错误:你的代码外层ArrayEach用了"resource_drift"作为定位路径,但待解析JSON里的目标数组键是"resource_changes",这会导致找不到对应数组,触发类型错误。
  2. 内层遍历逻辑错误:你试图直接在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:23:11