通常,要将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
模块完成了第一部分(从MessageDescriptor
到proto.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
。