来自对announcement blog post的评论:
关于JSON:JSON是结构化的 类似于Protocol Buffers,但是 协议缓冲二进制格式仍然是 更小更快的编码。 JSON 为...编写出色的文本编码 但协议缓冲区 - 它是 写一个编码器/解码器是微不足道的 转换任意协议 来自JSON的消息,使用 protobuf反射。这很好 与AJAX应用程序通信的方式, 因为使用户下载完整 protobuf解码器,当他们访问你的 页面可能太多了。
烹饪 映射可能是微不足道的,但两者之间是否有一个“明显”的映射,任何两个独立的开发团队自然会解决这个问题?如果两个产品支持PB数据并且可以互操作,因为它们共享相同的.proto规范,我想知道如果它们独立引入相同规范的JSON反射,它们是否仍然能够互操作。可能会有一些武断的决定,例如应该用字符串表示枚举值(人类可读的典型JSON)还是整数值?
是否有已建立的映射,以及用于从.proto规范生成JSON编码器/解码器的任何开源实现?
答案 0 :(得分:7)
答案 1 :(得分:6)
从我所看到的,Protostuff是用于Java的任何PB工作的项目,包括基于协议定义将其序列化为JSON。我自己没有用过,只听过好东西。
答案 2 :(得分:3)
是的,因为Protocol Buffers 3.0.0版(2016年7月28日发布) 是“JSON中定义良好的编码,作为二进制原型的替代 编码“,如发行说明中所述
答案 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()”方法的序列化,以检查字段是否已明确分配。