协议缓冲区序列化Golang

时间:2018-05-08 13:39:29

标签: go protocol-buffers dialogflow

我正在使用DialogFlow V2 official 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 :(得分:0)

这可以使用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
}