Go 协议缓冲区序列化

Go 协议缓冲区序列化,go,protocol-buffers,dialogflow-es,Go,Protocol Buffers,Dialogflow Es,我正在使用。在我的webhook中,我返回一个有效负载,我使用函数获取它 这又回来了。我想把这个结构转换成一个map[string]接口{}。这怎么可能 这是序列化结构时的外观: "payload": { "fields": { "messages": { "Kind": { "ListValue": { "values": [

我正在使用。在我的webhook中,我返回一个有效负载,我使用函数获取它

这又回来了。我想把这个结构转换成一个
map[string]接口{}
。这怎么可能

这是序列化结构时的外观:

"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"
        }
    ]
}
这可以通过以下方法解决


实现解组器接口以从json获取所需的数据返回的数据可以是任何格式没有结构
message
键和
StringValue
键不会更改,对吗?
messages
不会更改它将始终包含未知对象的列表使用接口{}并从deep中获取值,直到找不到字符串为止
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
}