如何接收具有任意字段值类型的 JSON 并使用 protobuf 解组以映射 [string]any

问题描述 投票:0回答:1

这是我的原型文件:

import "google/protobuf/struct.proto";

service Renderer {
  rpc Render(Request) returns (Response) {}
}

message Request {
  string template = 1;
  string locale = 2;
  google.protobuf.Struct variables = 3;
}

在以下函数中:

func (s *Server) Render(
    ctx context.Context,
    message *Request,
) (*Response, error) {
    fmt.Println(message.Variables.AsMap()) // is always empty

    return &Response{}, nil
}

即使我将其发送到服务器,变量字段也始终为空:

{
    "template": "template_name",
    "locale": "pt",
    "variables": {
        "foo": "bar"
    }
}

我期望

variables
包含
foo
作为键,
bar
作为值。我做错了什么?万一我做错了,我该怎么做才能实现这一目标?

go protocol-buffers grpc-go protobuf-go
1个回答
0
投票

看看

structpb
。它包含一个不错的例子。

您不能使用下面的 JSON 示例,因为它是一个

map[string]string
,并且这不足以通用来表示动态类型。

variables": {
  "foo": "bar"
}

如果您使用

structpb
来生成
{"foo":"bar"}
值:

package main

import (
    "log"

    "google.golang.org/protobuf/types/known/structpb"
)

func main() {
    v, err := structpb.NewValue(map[string]interface{}{
        "foo": "bar",
    })
    if err != nil {
        log.Fatal(err)
    }

    log.Println(v)
}

你会看到它在 Go 中表示为:

struct_value:{
  fields:{
    key:"foo" 
    value:{
      string_value:"bar"
    }
  }
}

这是代码中

Server.Render
所期望的
message.Variables

© www.soinside.com 2019 - 2024. All rights reserved.