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.descriptor
import FieldDescriptor
as 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 field
in 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的问题了

        

      

原文链接:http://blog.chinaunix.net/uid-27714502-id-4067350.html

protobuf与json互相转换的更多相关文章

  1. protobuf与json转换

    protobuf对象不能直接使用jsonlib去转,因为protobuf生成的对象的get方法返回的类型有byte[],而只有String类型可以作为json的key,protobuf提供方法进行转换 ...

  2. protobuf转json

    方法介绍 protobuf的介绍在这里就不详细介绍了,主要是俺也是刚接触,感兴趣的同学可以去搜索相关博客或者直接去看源码以及google的官方文档(官方文档表示很吃力)或者去这个网站:https:// ...

  3. protobuf与json相互转换的方法

    google的protobuf对象转json,不能直接使用FastJson之类的工具进行转换,原因是protobuf生成对象的get方法,返回的类型有byte[],而只有String类型可以作为jso ...

  4. json日期转换

    //调用 ChangeDateFormat(CreatTime) //json日期转换 function ChangeDateFormat(jsondate) { jsondate = jsondat ...

  5. java中Array/List/Map/Object与Json互相转换详解

    http://blog.csdn.net/xiaomu709421487/article/details/51456705 JSON(JavaScript Object Notation): 是一种轻 ...

  6. Json格式转换

    验证Json格式可以进入 http://json.cn/ json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构1.对象:对象 ...

  7. JSON.stringify转换Date不正确的解決方法

    JSON.stringify转换Date不正确的原因:国际时区(UTC)和中国时区(GMT)的原因,东八区+8等于国际时区. 解决方法,重新Es5的Date.prototype.toJSON方法,代码 ...

  8. 使用js进行string和json之间转换的方法

    在数据传输过种中,json是以文本,即字符串的形式传递,字符串形似Json对象: var str1 = '{ "name": "Amy", "sex& ...

  9. 前台 JSON对象转换成字符串 相互转换 的几种方式

    在最近的工作中,使用到JSON进行数据的传递,特别是从前端传递到后台,前台可以直接采用ajax的data函数,按json格式传递,后台Request即可,但有的时候,需要传递多个参数,后台使用requ ...

随机推荐

  1. k个区间相交的段落数 Educational Codeforces Round 4 D

    http://codeforces.com/contest/612/problem/D 题目大意:给你n个区间,这n个区间会有相交的部分,如果一个区间相交的部分>=k,那么就把这个区间记录下来. ...

  2. 5. JavaScript 正则表达式

    1. 概念 正则表达式(英语:Regular Expression,在代码中常简写为regex.regexp或RE)使用单个字符串来描述.匹配一系列符合某个句法规则的字符串搜索模式. 2. 使用字符串 ...

  3. ajax基本使用

    ajax在用于异步交互以来,一直被广泛使用,其使用语法格式基本如下: 基本格式为$.ajxa({ type:"",数据传送方式POST,GET url:"",处 ...

  4. ios可变数组的所有操作

    #pragma mark 创建数组c NSMutableArray * array =[[NSMutableArray alloc] initWithObjects:@"a",@& ...

  5. sql语句-排序后加入序号再运算判断取想要的项

    select a.id as aid,b.id as bid,a.city,a.cang,a.sid,a.time as atime,b.time as btime,a.price as aprice ...

  6. php文件去重复,二维数组筛选

    http://www.porter.com/fr/fr/product/648162|Sneakershttp://www.porter.com/fr/fr/product/642115|Bootsh ...

  7. 升级3.2.3后 could not find driver

    求解,之前一切正常,升级3.2.3后提示找不到数据库驱动我用的是mysql,也没有设置DB_DSN错误位置FILE: C:\Users\Administrator\workspace\test\Thi ...

  8. div+css位置绝对定位和相对定位

    position:absolute: 当div中被隔着些元素的话那么用此方法将把元素重叠在一起,所以元素可以不在容器中加也能重叠在一起

  9. 经典.net面试题目(2)

    101.在.net(C# or vb.net)中如何取消一个窗体的关闭. 答:private void Form1_Closing(object sender, System.ComponentMod ...

  10. JSP基本语法--包含指令<%@include file="路径"%> <jsp:include page>

    包含指令,真正改变的地方只有具体内容处: 方法1: 在每个jsp页面(HTML)都包含工具栏,头部信息,尾部信息,具体内容 方法2: 将工具栏,头部信息,尾部信息都分成各个独立的文件,使用的时候直接导 ...