如何仅使用消息描述符将 protobuf 线格式转换为 JSON?
How to convert protobuf wireformat to JSON with just a message descriptor?
通常,要将 protobuf 消息从有线格式转换为 JSON,您只需将有线格式解组为 proto.Message
,其动态类型是具体的 Go 类型(由 protoc-gen- 生成)去),然后使用 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
.
通常,要将 protobuf 消息从有线格式转换为 JSON,您只需将有线格式解组为 proto.Message
,其动态类型是具体的 Go 类型(由 protoc-gen- 生成)去),然后使用 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
.