首页 > 解决方案 > 用结构解组复杂的 JSON 广告

问题描述

我有来自 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"
          }
        }

将其与结构绑定。但我做不到。我正在尝试通过如下地图循环它

var f interface{}
    json.Unmarshal(b, &f)

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

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

标签: gostruct

解决方案


我建议您使用您关心的字段声明一个结构并将其解组,但如果您想坚持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


推荐阅读