Отмена сложного JSON ad bin со структурой в GO - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть следующий JSOn ответ от вызова webhook

{
  "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 Я не могу это сделать. Пожалуйста, помогите

1 Ответ

0 голосов
/ 19 апреля 2020

Я бы посоветовал вам объявить структуру с полями, которые вам нужны, и разбить ее, но если вы хотите придерживаться 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...