Протокол сериализации буфера Golang - PullRequest
0 голосов
/ 08 мая 2018

Я использую DialogFlow V2 официальный GoLang SDK . В моем webhook я возвращаю полезную нагрузку, которую я получаю с помощью функции GetWebhookPayload () .

Возвращает * google_protobuf4.Struct . Я хотел бы превратить эту структуру в map[string]interface{}. Как это возможно?

Вот как выглядит структура при сериализации:

"payload": {
        "fields": {
            "messages": {
                "Kind": {
                    "ListValue": {
                        "values": [
                            {
                                "Kind": {
                                    "StructValue": {
                                        "fields": {
                                            "title": {
                                                "Kind": {
                                                    "StringValue": "Hi! How can I help?"
                                                }
                                            },
                                            "type": {
                                                "Kind": {
                                                    "StringValue": "message"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        ]
                    }
                }
            }
        }

По сути, мне нужно, чтобы он был сериализован так:

"payload": {
    "messages": [
        {
            "title": "Hi! How can I help?",
            "type": "message"
        }
    ]
}

1 Ответ

0 голосов
/ 08 мая 2018

Это можно решить с помощью jsonpb .

package main

import (
    "bytes"
    "encoding/json"

    "github.com/golang/protobuf/jsonpb"
)

func main() {
    ...

    payload := qr.GetWebhookPayload()
    b, marshaler := bytes.Buffer{}, jsonpb.Marshaler{}
    if err := marshaler.Marshal(&b, payload.GetFields()["messages"]); err != nil {
        // handle err
    }

    msgs := []interface{}{}
    if err := json.Unmarshal(b.Bytes(), &msgs); err != nil {
        // handle err
    }

    // msgs now populated
}
...