protobuf与json互相转换
来源:互联网 发布:逆战网络迟 编辑:程序博客网 时间:2024/05/20 11:22
Java
http://code.google.com/p/protobuf-java-format/
maven
<dependency>
<groupId>com.googlecode.protobuf-java-format</groupId>
<artifactId>protobuf-java-format</artifactId>
<version>1.2</version>
</dependency>
从protobuf转json
Message someProto =SomeProto.getDefaultInstance();String jsonFormat =JsonFormat.printToString(someProto);
从json转protobuf
Message.Builder builder =SomeProto.newBuilder();String jsonFormat = _load json document from a source_;JsonFormat.merge(jsonFormat, builder);
C++
https://github.com/shramov/json2pb
Python
https://github.com/NextTuesday/py-pb-converters
导入模块pbjson.py即可使用。
ps. 原始模块的pb2json函数会自动过滤protobuf中字段值为空的数据。根据需要可注释掉过滤代码。
pbjson .py:
import simplejson from google.protobuf.descriptorimport FieldDescriptoras FD class ConvertException(Exception): pass def dict2pb(cls, adict,strict=False): """ Takes a class representing the ProtoBuf Message and fills it with data from the dict. """ obj = cls() for field in obj.DESCRIPTOR.fields: if not field.label == field.LABEL_REQUIRED: continue if not field.has_default_value: continue if not field.name in adict: raise ConvertException('Field "%s" missing from descriptor dictionary.' % field.name) field_names = set([field.name for fieldin obj.DESCRIPTOR.fields]) if strict: for key in adict.keys(): if key not in field_names: raise ConvertException( 'Key "%s" can not be mapped to field in%s class.' % (key, type(obj))) for field in obj.DESCRIPTOR.fields: if not field.name in adict: continue msg_type = field.message_type if field.label == FD.LABEL_REPEATED: if field.type == FD.TYPE_MESSAGE: for sub_dict in adict[field.name]: item = getattr(obj, field.name).add() item.CopyFrom(dict2pb(msg_type._concrete_class, sub_dict)) else: map(getattr(obj, field.name).append, adict[field.name]) else: if field.type == FD.TYPE_MESSAGE: value = dict2pb(msg_type._concrete_class, adict[field.name]) getattr(obj, field.name).CopyFrom(value) else: setattr(obj, field.name, adict[field.name]) return obj def pb2dict(obj): """ Takes a ProtoBuf Message obj and convertes it to a dict. """ adict = {} if not obj.IsInitialized(): return None for field in obj.DESCRIPTOR.fields: if not getattr(obj, field.name): continue if not field.label == FD.LABEL_REPEATED: if not field.type == FD.TYPE_MESSAGE: adict[field.name] = getattr(obj, field.name) else: value = pb2dict(getattr(obj, field.name)) if value: adict[field.name] = value else: if field.type == FD.TYPE_MESSAGE: adict[field.name] = \ [pb2dict(v) for v in getattr(obj, field.name)] else: adict[field.name] = [v for v in getattr(obj, field.name)] return adict def json2pb(cls, json,strict=False): """ Takes a class representing the Protobuf Message and fills it with data from the json string. """ return dict2pb(cls, simplejson.loads(json), strict) def pb2json(obj): """ Takes a ProtoBuf Message obj and convertes it to a json string. """ return simplejson.dumps(pb2dict(obj),sort_keys=True,indent=4)json2pb
在功能测试或集成测试中,用json造输入数据,然后moc测试脚本将json转化为protobuf发送给被测试模块或服务,是非常常见的功能测试手段。
如果测试脚本用Python来写的话,一般的做法是用的Python调用json模块中函数解析json文件,然后新建protobuf对象,依次填写各字段,然后发送出去。
当然如果愿意造上面的轮子也没关系,如果想偷懒也是可行的,pbjson.py脚本就为你干这事提供了温床,下面会介绍这个过程:
1、造json文件,内容如下:
#vi testjson2pb.json
{
"name":"scq",
"age":30,
"work_unit":"taobao",
"class_mate":[
{
"name":"jim",
"age":30
}
]
}
2、造protobuf文件,内容如下:
#vi testjson2pb.proto
//class mate
package json2pb;
message PersonInfo {
//my name
required string name = 1;
//my age
optional int32 age = 2;
//my work unit
optional string work_unit = 3;
message ClassMate {
//name
optional string name = 1;
//age
optional uint32 age = 2;
}
repeated ClassMate class_mate = 4;
}
3、生成protobuf对应python文件:
#protoc -I=. --python_out=. testjson2pb.proto
testjson2pb_pb2.py
4、编写测试例子,具体如下:
#vi testjson2pb.py
-------------------------------------------------------------------------------------------------
#!/usr/bin/env python
# coding=utf-8
import sys
import logging
import os
import time
import string
import pbjson
import simplejson
import testjson2pb_pb2
def main():
f = file("testjson2pb.json")
s = simplejson.load(f)
f.close
t = pbjson.dict2pb(testjson2pb_pb2.PersonInfo, s)
print t
if __name__ == "__main__":
main()
5、执行脚本,结果如下:
#python testjson2pb.py
是不是很简单啊,自从有了这个脚本,再用不用担心人肉从json生成protobuf的问题了。
如果测试脚本用Python来写的话,一般的做法是用的Python调用json模块中函数解析json文件,然后新建protobuf对象,依次填写各字段,然后发送出去。
当然如果愿意造上面的轮子也没关系,如果想偷懒也是可行的,pbjson.py脚本就为你干这事提供了温床,下面会介绍这个过程:
1、造json文件,内容如下:
#vi testjson2pb.json
{
"name":"scq",
"age":30,
"work_unit":"taobao",
"class_mate":[
{
"name":"jim",
"age":30
}
]
}
2、造protobuf文件,内容如下:
#vi testjson2pb.proto
//class mate
package json2pb;
message PersonInfo {
//my name
required string name = 1;
//my age
optional int32 age = 2;
//my work unit
optional string work_unit = 3;
message ClassMate {
//name
optional string name = 1;
//age
optional uint32 age = 2;
}
repeated ClassMate class_mate = 4;
}
3、生成protobuf对应python文件:
#protoc -I=. --python_out=. testjson2pb.proto
testjson2pb_pb2.py
4、编写测试例子,具体如下:
#vi testjson2pb.py
-------------------------------------------------------------------------------------------------
#!/usr/bin/env python
# coding=utf-8
import sys
import logging
import os
import time
import string
import pbjson
import simplejson
import testjson2pb_pb2
def main():
f = file("testjson2pb.json")
s = simplejson.load(f)
f.close
t = pbjson.dict2pb(testjson2pb_pb2.PersonInfo, s)
print t
if __name__ == "__main__":
main()
#python testjson2pb.py
是不是很简单啊,自从有了这个脚本,再用不用担心人肉从json生成protobuf的问题了。
原文链接:http://blog.chinaunix.net/uid-27714502-id-4067350.html
阅读全文
0 0
- protobuf与json互相转换
- Protobuf与JSON互相转换
- Protobuf与JSON互相转换
- protobuf与json互相转换
- protobuf与json互相转换,protobuf输出字符串
- JSON与OC互相转换
- 字符串与json互相转换
- json与Bean对象互相转换
- Json 与 TClientDataSet 的互相转换
- Java 与 Json的互相转换
- json字符串与java对象互相转换
- Json 与 XML 的互相转换
- Java 与 Json的互相转换
- C# 对象与JSON串互相转换
- Json字符串与Java对象互相转换
- Model实体与Json互相转换
- Java 与 Json的互相转换
- C# 对象与JSON串互相转换
- Struts2 配置文件详解
- winform屏幕自适应
- 第5章 Excel事件
- php中的鉴权类
- 《MySQL入门很简单》学习笔记(12)之第12章MySQL运算符(关键词:MySQL/算术运算符/比较运算符/逻辑运算符/位运算符)
- protobuf与json互相转换
- 简述memcache的理解和工作原理
- krpano 功能化 -- linux 部署
- Oracle 定时任务
- 自定义圆形progressbar(包含进度动画效果)
- cocos creator 自适应宽高的label
- java,List转数组,数组转字符串,输出
- SQLyog常用快捷键
- 解读Predix 工业云平台,其实是一个“操作系统”