json - 如何仅使用消息描述符将 protobuf 线格式转换为 JSON?

标签 json go reflection protocol-buffers descriptor

通常,要将 protobuf 消息从有线格式转换为 JSON,您只需将有线格式解码为 proto.Message其动态类型是具体的 Go 类型(由 protoc-gen-go 生成),然后使用 protojson 将其解码为 JSON包裹。
如果您没有具体的 Go 类型,但有 protoreflect.MessageDescriptor,我想知道如何做同样的事情反而。描述符应该具有解析有线格式并从中构造 JSON(或其他格式)所需的所有信息,但我似乎找不到用于此的 API。看来我需要以下内容:

func UnmarshalFromWire(b []byte, desc protoreflect.MessageDescriptor) (protoreflect.Message, error)

func MarshalToJSON(m protoreflect.Message) ([]byte, error)
是否有类似或类似的 API?

最佳答案

dynamicpb 模块执行第一部分(从 MessageDescriptorproto.Message ,而不是 protoreflect.Message )。

func UnmarshalFromWire(b []byte, desc protoreflect.MessageDescriptor) (proto.Message, error) {
  m := dynamicpb.NewMessage(desc)
  if err := proto.Unmarshal(b, m); err != nil {
    return nil, err
  }
  return m, nil
}
第二部分只是你的标准protojson.Marshal - 因为你现在有一个完全有效的 proto.Message .

关于json - 如何仅使用消息描述符将 protobuf 线格式转换为 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63197038/

相关文章:

go - 为什么在 printfl 中使用 + 号?

c# - 在运行时(不是编译时)用具有不同签名的委托(delegate)包装委托(delegate)

java - 调用一个重载的方法,其中所有参数都实现相同的接口(interface)

ios - NSJSONSerialization 使用有效的 json 返回 nil

json - 有没有办法不向任何人显示 API 的 JSON 响应?

jquery - 使用 $.post 将对象集合传递到 MVC Controller

c# - 无法从 NULL 读取属性 "Patient"

json - 将 JSON 动态解码为仅包含基于类型字段的顶级字段的结构

go - 如何实现基于行的文件内容的并行处理

c# - 使用反射调用不带参数的公共(public)方法