通常,要将protobuf消息从有线格式转换为JSON,只需将有线格式解组为动态类型为具体Go类型(由protoc-gen-go生成)的proto.Message,然后使用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

10-04 12:40