DialogFlow V2 Go SDK:google_protobuf4.Struct转map[string]interface{}方法
把DialogFlow V2 Go SDK中的
*google_protobuf4.Struct转成map[string]interface{} 其实这个需求非常好办——protobuf官方已经为structpb.Struct(也就是你说的google_protobuf4.Struct)提供了现成的转换方法,不用自己手动解析嵌套的fields和Kind字段。
核心解决方案
直接调用Struct类型的AsMap()方法,它会递归地将整个protobuf Struct结构转换成标准的Go map[string]interface{},同时自动处理所有嵌套类型:
- 嵌套的
StructValue会转成map[string]interface{} ListValue会转成[]interface{}- 各种基础类型(比如
StringValue、NumberValue)会转成对应的Go原生类型(string、float64等)
代码示例
假设你已经通过GetWebhookPayload()拿到了payload对象,转换代码就这么简单:
import ( "google.golang.org/protobuf/types/known/structpb" ) // 假设webhookRequest是你的DialogFlow请求对象 payload := webhookRequest.GetWebhookPayload() // 直接转成map[string]interface{} payloadMap := payload.AsMap()
针对你提供的示例结构的转换结果
你给出的序列化后的payload:
"payload": { "fields": { "messages": { "Kind": { "ListValue": { "values": [ { "Kind": { "StructValue": { "fields": { "title": { "Kind": { "StringValue": "Hi! How can I help..." } } } } } } ] } } } } }
经过AsMap()转换后,payloadMap会变成:
map[string]interface{}{ "messages": []interface{}{ map[string]interface{}{ "title": "Hi! How can I help...", }, }, }
完全符合你想要的map[string]interface{}结构,不需要自己手动解析那些嵌套的Kind字段,省了超多事。
内容的提问来源于stack exchange,提问作者kkyr
相关产品推荐
相关产品推荐

