zoukankan      html  css  js  c++  java
  • C++使用Json作为数据包装格式的通信

    出处:http://adebugger.cn/2009/11/cpp-json-data-communication/

    http://hi.baidu.com/tibelf/item/6be2accd177b3d0dc710b295

    Json大家都耳熟能详了吧?现在Json广泛用于各类通信,特别是基于Http协议的通信,一般的服务端动态脚本语言都有库支持Json的编码与解码。但很少有听过Json被C++使用来作为通信的格式,不过去了http://www.json.org/上面看了,已经有很多C++的库来支持Json的编码和解码,因为一个小东西要用到,最后使用的是Jsoncpp这个库。

    看到Jsoncpp的主页上介绍说,Jsoncpp是Json数据格式的编码解码器,提供reader和writer来进行解码和编码。下面就简要的介绍Jsoncpp里头的玩意:

    1.Reader
    该库中的Reader类用来将字串或者流载入解析器。是的后期可以用Reader里面的解析方法来解码Json字串为C++认识的数据。可以用 Json::Reader来声明一个Reader实例。Reader中最常用的就是一个parse方法,该方法用来将载入的json字串解析为C++格式的数据。

    2.Value
    这是该库中的核心类,用于存储各样格式的数据,可以包括int,double,short,char *,string,bool,object,array等几乎所有格式的数据。该库的编码和解码的核心功能都是用Value类实现的。就用以上的 Reader的parse方法来说,需要传入一个Value类别的引用值,就是用来存储Json数据的根值,并且可以用这个根值来存取其他的所有值。

    3.Writer
    这是该库的一个虚类,没有真正的实现encode的功能。需要重载里头的方法来实现真正的encode功能

    4.FastWriter
    这是该库中真正实现encode功能的类,用来实现将Value编码称为Json串.

    我暂时用到的是以上的这些类,该库还提供处理Json字串的注释,提供style来格式化Json字串是的更容易人阅读等功能,这些都没有用到,等以后用到了再来分享。下面用一段简短的代码来看以上这些Jsoncpp的基本功能:

    C++语言:01
    21 string encode_game_play_msg(string token,int game_id,vector<piece> piece_array){
    22 Json::Value root;
    23 Json::Value var;
    24
    25 //apply “token” and “game_id” value to json struct
    26 var["token"] = token;
    27 var["game_id"] = game_id;
    28
    29 Json::Value pieces;//store all pieces
    30 for (int i=0;i < piece_array.size();i++)
    31 {
    32 Json::Value piece_ex;//here it store just one piece
    33
    34 //next 4 lines to apply piece value to json struct
    35 piece_ex["letter"] = piece_array[i].letter;
    36 piece_ex["wild"] = piece_array[i].wild;
    37 piece_ex["x"] = piece_array[i].x;
    38 piece_ex["y"] = piece_array[i].y;
    39 pieces.append(piece_ex);//ok,yes we just have apply One piece ,then push back to the array
    40 }
    41 var["piece_array"] = pieces;//yes,store pieces in var [Value]
    42 root.append(var);
    43
    44 Json::FastWriter writer;
    45 return writer.write(var);//generate json string:),here all is done
    46 }

    上面这段代码还是相对用到了jsoncpp的大部分编码功能的,用来将数据编码称为json字符串,下面会仔细的分析这段代码

    1.首先请看注释中的!IN部分,这是这个函数的传入参数。有三个一个是string类型的token,一个是int类型的game_id,一个是 array,用来存储所有的piece。看!OUT部分就是所要输出的json格式的字符串。用后面的输出可以看到,这个Json字符串中有一个大的根 object,里头有三样东西,1.token,2.game_id,3.piece_array。

    2.encode过程
    首先之前已经说过,Value在Jsoncpp中是核心类,Reader和Writer都是用Value的功能。以上代码中有[]操作符来赋值给 Value,Value应该是类似一个map结构的数据仓库,用来用树存储所有的数据,最后转换后来编码称为Json格式的字符串。在编码数组的过程中 Value提供了一个append函数用来附加到Value里面,千万记得我前面说过,Value可以直接存数组。当然,Value的[]操作符不能直接的用数组作为参数,如果能这样就牛了。C++这等编译语言是做不到这么动态的,所以可以看到代码里面其实是Value的嵌套,用Value来实现一个数组元素的赋值,因为数组元素不是一个简单的编译器支持的内部类型,所以需要解开来赋值。

    3.encode
    最后直接用FastWriter来实现编码输出,这样一个典型的Jsoncpp的编码Json的过程。

    再来看一段解码json串的代码

    C++语言:01
    30 game_info decode_lobby_data_return_msg(string lobby_data_return_msg){
    31 Json::Value root;
    32 Json::Reader reader;
    33 game_info gi;
    34 bool parsedOk = false;
    35 parsedOk = reader.parse(lobby_data_return_msg,root,false);//decoding…
    36 if (!parsedOk)//decoded failed
    37 {
    38 cout<<“parsed error! “<<reader.getFormatedErrorMessages()<<endl;
    39 gi.id = -1000;//game id = -1000,means parsed error!
    40 return gi;
    41 }
    42
    43 Json::Value game = root["game"];
    44
    49 gi.id = game["id"].asInt();
    50 gi.creator_id = game["creator_id"].asInt();
    51 gi.user_max = game["user_max"].asInt();
    52
    53 Json::Value template_r = game["template"];
    54 gi.template_r.id = template_r["id"].asInt();
    55
    56 Json::Value users = game["user_array"];//because user_array is a array ,so we must get its element by [for] circle,please see [for] circle below
    57 for (int index=0;index < users.size();index++)
    58 {
    59
    63 user_info u;
    64 u.id = users[index]["id"].asInt();
    65 u.name = users[index]["name"].asString();
    66 gi.user_array.push_back(u);
    67 }
    68
    69 return gi;
    70 }

    这是一段典型的解码json字符串的代码,注释中已经非常明白的写出了该函数的输入和输出,下面简要的分析一下这段代码

    1.parse,这个函数在上面的介绍中已经写过,是用来解码字串称为Value格式的数据的函数,然后是要判断函数的返回值,如果返回为 false,那么说明json字串解码错误。

    2.当解码成功以后,就是要操作返回的Value值。这里对于如何取Value里头的值,Jsoncpp的Value类提供了两个方法,一个是 get函数,第二个是[]操作符,我个人觉得还是[]好用,传入的参数的json里头的key,你就可以把key所对应的value取出来

    3.当提取出来的是数组时,需要逐个提取里面的元素,然后再用Value的转换功能来实现值的提取。Value提供asXXX函数来转换值。

    以上的是简要的介绍了Jsoncpp里头的编码和解码功能。

  • 相关阅读:
    C# 操作配置文件
    C# Excel操作类
    没有找到 mspdb100.dll 的解决办法
    工厂方法模式
    .Net互操作2
    The certificate used to sign “AppName” has either expired or has been revoked. An updated certificate is required to sign and install the application解决
    手机抓包xcode自带命令行工具配合wireshark实现
    expecting SSH2_MSG_KEX_ECDH_REPLY ssh_dispatch_run_fatal问题解决
    使用ssh-keygen设置ssh无密码登录
    远程复制文件到服务器
  • 原文地址:https://www.cnblogs.com/yssgyw/p/3313425.html
Copyright © 2011-2022 走看看