0

我是 protobuf 的新手,我想将一些 protobuf 保存为 json 格式,并且知道 protobuf 的完整格式是什么。我试过只创建一个 protobuf 的空实例,并将其保存到 json,但这只会给我一个空的 json 对象,{}.

如果我为一个属性填写一个值,并对其进行序列化,我会在 json 中获得该属性,这很好,但我不想对我想要执行的每个 protobuf 的所有属性都执行此操作.

有没有办法让我在不为每个字段提供值的情况下查看 protobuf 的完整 json 格式?

笔记
  • 我在 Java 中使用 Google 的 protobuf 库,并且可以序列化和反序列化我的对象,我只是不确定如何为特定对象编写 json。
  • 我已经查看了这个 stackoverflow 问题以获取信息,但没有发现任何帮助。
4

2 回答 2

1

是的,proto3 的 JSON 格式已记录在案

或者,要查看示例而不更改默认值,您可以includingDefaultValueFields在打印时指定:

String json = JsonFormat.printer().includingDefaultValueFields().print(message);

(这至少应该适用于原语;我怀疑null如果嵌套消息尚未初始化,它将打印它们。)

于 2019-10-28T11:34:33.093 回答
0

与此问题的答案中所做的并没有什么不同,但这是我出于我的目的将其包装起来的方式-您的结果可能会有所不同,哈哈!这允许我从 json 文件加载消息,并反序列化为 grpc 方法的请求。

  import com.google.protobuf.InvalidProtocolBufferException;
  import com.google.protobuf.MessageOrBuilder;
  import com.google.protobuf.util.JsonFormat;

  /**
   * Convert gRPC message to Json string.
   *
   * @param messageOrBuilder the gRPC message
   * @return a Json string
   */
  public static String grpcMessageToJson(MessageOrBuilder messageOrBuilder) {
    String result = "";
    if (messageOrBuilder == null) {
      return result;
    }

    try {
      result = JsonFormat.printer().print(messageOrBuilder);
    } catch (InvalidProtocolBufferException e) {
      LOGGER.warn("Cannot serialize the gRPC message.", e);
    }

    return result;
  }
于 2021-02-11T20:20:13.393 回答