go - 用结构解码复杂的 JSON 广告

标签 go struct

我有来自 webhook 调用的以下 JSOn 响应

{
  "responseId": "d5c70d8b-e8ad-41df-bb3b-26b0e51d60ca-a14fa99c",
  "queryResult": {
    "queryText": "1111111111",
    "parameters": {
      "phone-number": "1111111111"
    },
    "allRequiredParamsPresent": true,
    "fulfillmentText": "Thats great! You payment link has been sent to Gaf ( Mobile number 1111111111 )",
    "fulfillmentMessages": [{
      "text": {
        "text": ["Thats great! You payment link has been sent to Far ( Mobile number 1111111111 )"]
      }
    }],
    "outputContexts": [{
      "name": "projects/open-prod-bot-pfgibi/agent/sessions/80f2fb70-01d0-fc1d-200a-ccbae5572829/contexts/awaiting_name",
      "lifespanCount": 2,
      "parameters": {
        "name": ["Gar"],
        "name.original": ["Gar"],
        "phone-number": "1111111111",
        "phone-number.original": "1111111111"
      }
    }, {
      "name": "projects/open-prod-bot-pfgibi/agent/sessions/80f2fb70-01d0-fc1d-200a-ccbae5572829/contexts/awaiting_number",
      "lifespanCount": 4,
      "parameters": {
        "phone-number": "1111111111",
        "phone-number.original": "1111111111"
      }
    }, {
      "name": "projects/open-prod-bot-pfgibi/agent/sessions/80f2fb70-01d0-fc1d-200a-ccbae5572829/contexts/awaiting_name_confirm",
      "lifespanCount": 3,
      "parameters": {
        "name": ["Gaf"],
        "name.original": ["Far"],
        "phone-number": "1111111111",
        "phone-number.original": "1111111111"
      }
    }, {
      "name": "projects/open-prod-bot-pfgibi/agent/sessions/80f2fb70-01d0-fc1d-200a-ccbae5572829/contexts/__system_counters__",
      "parameters": {
        "no-input": 0.0,
        "no-match": 0.0,
        "phone-number": "1111111111",
        "phone-number.original": "1111111111"
      }
    }],
    "intent": {
      "name": "projects/open-prod-bot-pfgibi/agent/intents/d21f7be5-0f77-4cb8-9857-26ba04964317",
      "displayName": "GetMobileNumber"
    },
    "intentDetectionConfidence": 1.0,
    "languageCode": "en"
  },
  "originalDetectIntentRequest": {
    "payload": {
    }
  },
  "session": "projects/open-prod-bot-pfgibi/agent/sessions/80f2fb70-01d0-fc1d-200a-ccbae5572829"
}

我想提取出来
"outputContexts": [{
          "name": "projects/open-prod-bot-pfgibi/agent/sessions/80f2fb70-01d0-fc1d-200a-ccbae5572829/contexts/awaiting_name",
          "lifespanCount": 2,
          "parameters": {
            "name": ["Gar"],
            "name.original": ["Gar"],
            "phone-number": "1111111111",
            "phone-number.original": "1111111111"
          }
        }

将其与结构绑定(bind)。但我做不到。我正在尝试通过如下 map 循环它
var f interface{}
    json.Unmarshal(b, &f)

    for k, v := range f.(map[string]interface{}) {
        if k == "queryResultmap" {
            fmt.Println(v)
        }
    }

但不工作。我是 Go 新手。在 google 中尝试了几个示例,但由于这是一个复杂的 JSON,我无法做到。请帮忙

最佳答案

我建议您使用您关心的字段声明一个结构并将其解码,但如果您想坚持 interface{}试试这个:

m := f.(map[string]interface{})
r := m["queryResult"].(map[string]interface{})
fmt.Println(r["outputContext"])

https://play.golang.com/p/gA5wWcPyd6E

使用结构:
type OutputContext struct {
    Name          string `json:"name"`
    LifespanCount int    `json:"lifespanCount"`
    Parameters    struct {
        Name                []string `json:"name"`
        NameOriginal        []string `json:"name.original"`
        PhoneNumber         string   `json:"phone-number"`
        PhoneNumberOriginal string   `json:"phone-number.original"`
        NoInput             float64  `json:"no-input"`
        NoMatch             float64  `json:"no-match"` 
    } `json:"parameters"`
}

type QueryResult struct {
    OutputContexts []OutputContext `json:"outputContexts"`
}

// ...

var dest struct {
    QueryResult QueryResult `json:"queryResult"`
}
if err := json.Unmarshal(data, &dest); err != nil {
    panic(err)
}

for _, v := range dest.QueryResult.OutputContexts {
    fmt.Printf("%+v\n", v)
}

https://play.golang.com/p/EfIugDQJ651

关于go - 用结构解码复杂的 JSON 广告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61308437/

相关文章:

arrays - 如何从golang中的结构数组中检索元素数组?

go - 使用csv read在单值上下文中处理多值

go - 如何在 Go 中使用 JWK 验证 JWT 签名?

random - 去 rand.Intn 相同的数字/值

go - 出于文档目的键入别名

c++ - 如何在cgo中从打包的struct处理char *?

c++ - 嵌入结构和正确的函数调用

C++ 覆盖父结构中的数据不起作用

使用结构创建游戏板

c++ - 从 C++ 中的函数输出多个值