无法访问Golang代码中的JSON元素

toe95027  于 2023-04-08  发布在  Go
关注(0)|答案(1)|浏览(115)

我有以下Golang代码:

package main

import (
    "bytes"
    "encoding/json"
    "fmt"   
    "strings"
)

func someFunc() {
    output := `
    {
        "predictions": [
          {
            "displayNames": [
              "AAA",
              "BBB",
              "CCC",
              "DDD",
              "EEE",
              "FFF",
              "GGG",
              "HHH"
            ],
            "confidences": [
              0.99998986721038818,
              5.3742646741739009e-06,
              1.7922732240549522e-06,
              1.5455394475338835e-07,
              3.2323268328582344e-07,
              6.80681324638499e-08,
              9.2994454803374538e-08,
              2.317885900993133e-06
            ],
            "ids": [
              "552624439724867584",
              "7470153467365949440",
              "6317231962759102464",
              "8911305348124508160",
              "4011388953545408512",
              "2858467448938561536",
              "5164310458152255488",
              "1705545944331714560"
            ]
          }
        ],
        "deployedModelId": "ABC123",
        "model": "myOwnModel",
        "modelDisplayName": "myDisplayName",
        "modelVersionId": "1"
    }`
    var outputJson map[string]interface{}
    json.Unmarshal([]byte(output), &outputJson)

    // names := outputJson["predictions"].(data)[0].(data)["displayNames"].(data)
    // ids := outputJson["predictions"].(data)[0].(data)["ids"].(data)
    // confidences := outputJson["predictions"].(data)[0].(data)["confidences"].(data)
    // fmt.Printf(fmt.Sprintf("Names:\n%s\n", names))
    // fmt.Printf(fmt.Sprintf("IDs:\n%s\n", ids))
    // fmt.Printf(fmt.Sprintf("Confidences:\n%s\n", confidences))

    fmt.Println("something")
}

func main() {
    someFunc()
}

我想从outputJson访问displayNamesidsconfidences元素。我使用VS Code检查它们的位置,并将它们添加到监视列表。

然后我将位置字符串复制到我的代码中。然而,它并不像图中所示那样工作。抱怨是data未定义。为什么会发生这种情况,我可以做些什么来访问这些元素?为什么这个data在监 windows 口中工作,而不是在代码中?

eyh26e7m

eyh26e7m1#

您需要通过outputJsontype assert

p := outputJson["predictions"]
if x, ok := p.([]interface{}); ok {
    if y, ok := x[0].(map[string]interface{}); ok {
        fmt.Println(y["displayNames"])
    }
}

但是,考虑到你不需要解码任意JSON,一个更好的方法是定义一个Golang类型树,然后解组到其中:

type Output struct {
    Predictions []Prediction `json:"predictions"`
}
type Prediction struct {
    DisplayNames []string `json:"displayNames"`
    // Confidences ...
}

func main() {

    ...
    foo := &Output{}
    if err := json.Unmarshal([]byte(output), foo); err == nil {
        fmt.Println(foo.Predictions[0].DisplayNames)
    }
}

相关问题