登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-18 12:12:38 176浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《如何仅使用消息描述符将 protobuf 线格式转换为 JSON?》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

通常,要将 protobuf 消息从有线格式转换为 json,只需将有线格式解组为 proto.message ,其动态类型是具体的 go 类型(由 protoc-gen-go 生成),然后将其解组为json 与 protojson 包。

如果您没有具体的 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

本篇关于《如何仅使用消息描述符将 protobuf 线格式转换为 JSON?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>