kkyr
kkyr

Reputation: 3845

Protocol buffer serialization Golang

I am using DialogFlow V2 official GoLang SDK. In my webhook, I am returning a payload, which I'm obtaining using the function GetWebhookPayload().

This returns *google_protobuf4.Struct. I would like to turn this struct into a map[string]interface{}. How is this possible?

This is what the struct looks like when serialized:

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

What I essentially need is for it to be serialized as such:

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

Upvotes: 1

Views: 2593

Answers (1)

kkyr
kkyr

Reputation: 3845

This can be solved using 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
}

Upvotes: 1

Related Questions