代码之家  ›  专栏  ›  技术社区  ›  Alexander Klauer

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

  •  0
  • Alexander Klauer  · 技术社区  · 4 年前

    通常,要将protobuf消息从wire格式转换为JSON,只需将wire格式解组为 proto.Message 其动态类型是一个具体的Go类型(由protoc gen Go生成),然后用 protojson 包裹

    我想知道如果你 不要 有一个具体的围棋类型,但是 protoreflect.MessageDescriptor 相反描述符应该具有解析wire格式并从中构造JSON(或其他格式)所需的所有信息,但我似乎找不到用于此的API。似乎我需要以下东西:

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

    有这样或类似的API吗?

    0 回复  |  直到 4 年前
        1
  •  1
  •   Rafael Lerm    4 年前

    这个 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 -既然你现在有一个完全有效的 普罗托。消息 .