golang 是否提供了一种简单的方法来输出人类可读的 protobuf

问题描述 投票:0回答:5

有没有一种好方法可以在 golang 中获得人类可读的 protobuf 对象的字符串表示形式?相当于 https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.message#Message.DebugString?

我正在使用https://github.com/golang/protobuf

go protocol-buffers
5个回答
17
投票

我相信您正在寻找 proto.MarshalTextString

p := &example.Test{
  Label: proto.String("this"),
  Reps:  []int64{4, 3, 2, 1},
  InnerTest: &example.Test_InnerTest{
    InnerLabel: proto.String("is the end"),
  },
}

fmt.Println(proto.MarshalTextString(p))

你可以在Go包test中看到一个例子。


4
投票

您可以使用TextMarshaler。稍微修改一下示例原型:

p := &example.Test{
    Label: proto.String("this"),
    Reps:  []int64{4, 3, 2, 1},
    InnerTest: &example.Test_InnerTest{
        InnerLabel: proto.String("is the end"),
    },
}

t := proto.TextMarshaler{}
t.Marshal(os.Stdout, p)

输出:

label: "this"
reps: 4
reps: 3
reps: 2
reps: 1
inner_test: <
  inner_label: "is the end"
>

4
投票

示例一:

package main
import "google.golang.org/protobuf/types/known/structpb"

func example1(x *structpb.Struct) string {
   return x.String()
}

示例二:

package main

import (
   "google.golang.org/protobuf/proto"
   "google.golang.org/protobuf/runtime/protoimpl"
)

func example2(m proto.Message) string {
   return protoimpl.X.MessageStringOf(m)
}

示例三:

package main

import (
   "google.golang.org/protobuf/encoding/protojson"
   "google.golang.org/protobuf/proto"
)

func example3(m proto.Message) string {
   return protojson.Format(m)
}

测试:

package main
import "google.golang.org/protobuf/types/known/structpb"

func main() {
   m, err := structpb.NewStruct(map[string]interface{}{
      "month": 12, "day": 31,
   })
   if err != nil {
      panic(err)
   }
   println(example1(m))
   println(example2(m))
   println(example3(m))
}

结果:

fields:{key:"day" value:{number_value:31}} fields:{key:"month" value:{number_value:12}}
fields:{key:"day" value:{number_value:31}} fields:{key:"month" value:{number_value:12}}
{
  "day": 31,
  "month": 12
}

1
投票

如果您需要将 PB 编组为结构化消息(JSON 格式)以供将来使用,可以使用 MarshalToString

一个简单的例子:

marshaler := &jsonpb.Marshaler{}
reqString, err := marshaler.MarshalToString(req)
log.Println("@@REQ@@", reqString)

或者参考官方单元测试就可以了


0
投票

由于 github.com/golang/protobuf 现已弃用,我正在为包 google.golang.org/protobuf 编写这个答案,因为它可能会帮助新读者。

prototext 包旨在将消息与文本格式相互转换。输出是人类可读的。使用其他答案中的相同示例:

p := &example.Test{
  Label: proto.String("this"),
  Reps:  []int64{4, 3, 2, 1},
  InnerTest: &example.Test_InnerTest{
    InnerLabel: proto.String("is the end"),
  },
}

fmt.Println(prototext.Format(p))

但是,我建议使用 protojson 包,因为它的输出也是人类可读的,并且有更多可用选项。例如,如果您想以人类可读的方式输出消息的所有字段,即使是那些未填充的字段,您也可以这样做

p := &example.Test{
  Label: proto.String("this"),
  Reps:  []int64{4, 3, 2, 1},
  InnerTest: &example.Test_InnerTest{
    InnerLabel: proto.String("is the end"),
  },
}

fmt.Println(
    protojson.MarshalOptions{
        Multiline: true, 
        EmitUnpopulated: true,
    }.Format(p)
)
© www.soinside.com 2019 - 2024. All rights reserved.