JSON和Protocol Buffers之间是否存在标准映射?

时间:2010-03-30 11:01:23

标签: json protocol-buffers

来自对announcement blog post的评论:

  

关于JSON:JSON是结构化的   类似于Protocol Buffers,但是   协议缓冲二进制格式仍然是   更小更快的编码。 JSON   为...编写出色的文本编码   但协议缓冲区 - 它是   写一个编码器/解码器是微不足道的   转换任意协议   来自JSON的消息,使用   protobuf反射。这很好   与AJAX应用程序通信的方式,   因为使用户下载完整   protobuf解码器,当他们访问你的   页面可能太多了。

烹饪 映射可能是微不足道的,但两者之间是否有一个“明显”的映射,任何两个独立的开发团队自然会解决这个问题?如果两个产品支持PB数据并且可以互操作,因为它们共享相同的.proto规范,我想知道如果它们独立引入相同规范的JSON反射,它们是否仍然能够互操作。可能会有一些武断的决定,例如应该用字符串表示枚举值(人类可读的典型JSON)还是整数值?

是否有已建立的映射,以及用于从.proto规范生成JSON编码器/解码器的任何开源实现?

5 个答案:

答案 0 :(得分:7)

答案 1 :(得分:6)

从我所看到的,Protostuff是用于Java的任何PB工作的项目,包括基于协议定义将其序列化为JSON。我自己没有用过,只听过好东西。

答案 2 :(得分:3)

是的,因为Protocol Buffers 3.0.0版(2016年7月28日发布) 是“JSON中定义良好的编码,作为二进制原型的替代 编码“,如发行说明中所述

https://github.com/google/protobuf/releases/tag/v3.0.0

答案 3 :(得分:2)

我需要从GeneratedMessageLite封送到JSON对象,但不需要解组。我无法在Pangea的答案中使用protobuf库,因为它不适用于LITE_RUNTIME选项。我也不想为已经很大的遗留系统负担,为现有的协议缓冲区生成更多的编译代码。为了编组到JSON,我使用这个简单的解决方案来编组

    final Person gpb = Person.newBuilder().setName("Bill Monroe").build();
    final Gson gson = new Gson();
    final String jsonString = gson.toJson(gpb);

答案 4 :(得分:1)

还有一个想法:如果protobuf对象具有getter / setter或适当命名的字段,则可以简单地使用Jackson JSON处理器的数据绑定。默认情况下,它处理公共getter,任何setter和public字段,但这些只是默认的可见性级别,可以更改。如果是这样,杰克逊可以毫无问题地序列化/反序列化protobuf生成的POJO。

我实际上已经将这种方法用于Thrift生成的对象;我唯一需要配置的是禁用Thrift添加的各种“isXXX()”方法的序列化,以检查字段是否已明确分配。