使用 golang jsonparser 迭代元素数组值?

问题描述 投票:0回答:2

我正在编写一个简单的应用程序来测试使用 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"],
      }
    }
  ]
go
2个回答
0
投票
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)



0
投票

你就快到了。您的实施有几个问题:

  1. action
    是一个字节数组,其中包含给定迭代时数组中的元素的字节。 (在本例中,它是
    update
    。)运行
    jsonparser.GetString(action)
    是不正确的,因为
    action
    不是字节数组中正确的 json 表示,即使是,您也没有提供正确的参数来获取字节数组中给定 json 表示形式内的路径。对于您的情况,您可以简单地使用
    string(action)
  2. 根据您给定的 json 示例,
  3. 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")
© www.soinside.com 2019 - 2024. All rights reserved.