菜鸟笔记
提升您的技术认知

c json 详解-ag真人游戏

 一. 使用jsoncpp解析json

jsoncpp是个跨平台的开源库,首先从http://jsoncpp.sourceforge.net/上下载jsoncpp库源码,我下载的是v0.5.0,压缩包大约107k,解压,在jsoncpp-src-0.5.0/makefiles/vs71目录里找到jsoncpp.sln,用vs2003及以上版本编译,默认生成静态链接库。 在工程中引用,只需要include/json及.lib文件即可。

 使用jsoncpp前先来熟悉几个主要的类: 

json::value     可以表示里所有的类型,比如int,string,object,array等,具体应用将会在后边示例中介绍。

json::reader   将json文件流或字符串解析到json::value, 主要函数有parse。

json::writer    与json::reader相反,将json::value转化成字符串流,注意它的两个子类:json::fastwriter和json::stylewriter,分别输出不带格式的json和带格式的json。

 1. 从字符串解析json

  1. int parsejsonfromstring()  
  2. {  
  3.   const char* str = "{\"uploadid\": \"up000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}";  
  4.   
  5.   json::reader reader;  
  6.   json::value root;  
  7.   if (reader.parse(str, root))  // reader将json字符串解析到root,root将包含json里所有子元素   
  8.   {  
  9.     std::string upload_id = root["uploadid"].asstring();  // 访问节点,upload_id = "up000000"   
  10.     int code = root["code"].asint();    // 访问节点,code = 100   
  11.   }  
  12.   return 0;  
  13. }  
int parsejsonfromstring()
{
  const char* str = "{\"uploadid\": \"up000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}";

json::reader reader;
json::value root;
if (reader.parse(str, root)) // reader将json字符串解析到root,root将包含json里所有子元素
{
std::string upload_id = root[“uploadid”].asstring(); // 访问节点,upload_id = “up000000”
int code = root[“code”].asint(); // 访问节点,code = 100
}
return 0;
}

2. 从文件解析json

json文件内容:

  1. {  
  2.     "uploadid": "up000000",  
  3.     "code": "0",  
  4.     "msg": "",  
  5.     "files":  
  6.     [  
  7.         {  
  8.             "code": "0",  
  9.             "msg": "",  
  10.             "filename": "1d_16-35_1.jpg",  
  11.             "filesize": "196690",  
  12.             "width": "1024",  
  13.             "height": "682",  
  14.             "images":  
  15.             [  
  16.                 {  
  17.                     "url": "fmn061/20111118",  
  18.                     "type": "large",  
  19.                     "width": "720",  
  20.                     "height": "479"  
  21.                 },  
  22.                 {  
  23.                     "url": "fmn061/20111118",  
  24.                     "type": "main",  
  25.                     "width": "200",  
  26.                     "height": "133"  
  27.                 }  
  28.             ]  
  29.         }  
  30.     ]  
  31. }  
{
    "uploadid": "up000000",
    "code": "0",
    "msg": "",
    "files":
    [
        {
            "code": "0",
            "msg": "",
            "filename": "1d_16-35_1.jpg",
            "filesize": "196690",
            "width": "1024",
            "height": "682",
            "images":
            [
                {
                    "url": "fmn061/20111118",
                    "type": "large",
                    "width": "720",
                    "height": "479"
                },
                {
                    "url": "fmn061/20111118",
                    "type": "main",
                    "width": "200",
                    "height": "133"
                }
            ]
        }
    ]
}

 解析代码:

  1. int parsejsonfromfile(const char* filename)  
  2. {  
  3.   // 解析json用json::reader   
  4.   json::reader reader;  
  5.   // json::value是一种很重要的类型,可以代表任意类型。如int, string, object, array...   
  6.   json::value root;         
  7.   
  8.   std::ifstream is;  
  9.   is.open (filename, std::ios::binary );    
  10.   if (reader.parse(is, root))  
  11.   {  
  12.     std::string code;  
  13.     if (!root["files"].isnull())  // 访问节点,access an object value by name, create a null member if it does not exist.   
  14.       code = root["uploadid"].asstring();  
  15.       
  16.     // 访问节点,return the member named key if it exist, defaultvalue otherwise.   
  17.     code = root.get("uploadid", "null").asstring();  
  18.   
  19.     // 得到"files"的数组个数   
  20.     int file_size = root["files"].size();  
  21.   
  22.     // 遍历数组   
  23.     for(int i = 0; i < file_size;  i)  
  24.     {  
  25.       json::value val_image = root["files"][i]["images"];  
  26.       int image_size = val_image.size();  
  27.       for(int j = 0; j < image_size;  j)  
  28.       {  
  29.         std::string type = val_image[j]["type"].asstring();  
  30.         std::string url = val_image[j]["url"].asstring();  
  31.       }  
  32.     }  
  33.   }  
  34.   is.close();  
  35.   return 0;  
  36. }  
int parsejsonfromfile(const char* filename)
{
  // 解析json用json::reader
  json::reader reader;
  // json::value是一种很重要的类型,可以代表任意类型。如int, string, object, array...
  json::value root;       

std::ifstream is;
is.open (filename, std::ios::binary );
if (reader.parse(is, root))
{
std::string code;
if (!root[“files”].isnull()) // 访问节点,access an object value by name, create a null member if it does not exist.
code = root[“uploadid”].asstring();

// 访问节点,return the member named key if it exist, defaultvalue otherwise.
code = root.get("uploadid", "null").asstring();
// 得到"files"的数组个数
int file_size = root["files"].size();
// 遍历数组
for(int i = 0; i < file_size;   i)
{
  json::value val_image = root["files"][i]["images"];
  int image_size = val_image.size();
  for(int j = 0; j < image_size;   j)
  {
    std::string type = val_image[j]["type"].asstring();
    std::string url = val_image[j]["url"].asstring();
  }
}

}
is.close();
return 0;
}

 3. 在json结构中插入json

  1. json::value arrayobj;   // 构建对象   
  2. json::value new_item, new_item1;  
  3. new_item["date"] = "2011-12-28";  
  4. new_item1["time"] = "22:30:36";  
  5. arrayobj.append(new_item);  // 插入数组成员   
  6. arrayobj.append(new_item1); // 插入数组成员   
  7. int file_size = root["files"].size();  
  8. for(int i = 0; i < file_size;  i)  
  9.   root["files"][i]["exifs"] = arrayobj;   // 插入原json中  
    json::value arrayobj;   // 构建对象
    json::value new_item, new_item1;
    new_item["date"] = "2011-12-28";
    new_item1["time"] = "22:30:36";
    arrayobj.append(new_item);  // 插入数组成员
    arrayobj.append(new_item1); // 插入数组成员
    int file_size = root["files"].size();
    for(int i = 0; i < file_size;   i)
      root["files"][i]["exifs"] = arrayobj;   // 插入原json中

 4. 输出json

  1. // 转换为字符串(带格式)   
  2. std::string out = root.tostyledstring();  
  3. // 输出无格式json字符串   
  4. json::fastwriter writer;  
  5. std::string out2 = writer.write(root);  
// 转换为字符串(带格式)
std::string out = root.tostyledstring();
// 输出无格式json字符串
json::fastwriter writer;
std::string out2 = writer.write(root);

jsoncpp的一些使用方法介绍:

1、初始化

json::value root;

json::reader reader;

reader.parse(“{“name”:”sunny”}”, root);

reader可以用来初始化一个人json从字符串。

2、读取json文件初始化

这是我写的一个方法:

  [cpp]  view plain copy  
  1. json::value byjsondatamanager::getjsonfromfile(const char* filename){  
  2.     json::reader reader;  
  3.     ifstream file(getfullpath(filename));  
  4.     ccassert(file.is_open(), "file is open fail!");  
  5.     json::value root;  
  6.     if  (!reader.parse(file, root, false )) {  
  7.         ccassert(false, "json::reader parse error!");  
  8.     }  
  9.     return root;  
  10. }  

3、解析json

首先生成一个json

json::value myjson = getjsonfromfile(“test.json”);  //利用上面的函数生成一个json。

int num = myjson["num"].asint();

string str = myjson["name"].asstring();

 

4、json数组

json::value myjson = getjsonfromfile(“test.json”);//利用上面的函数生成一个json。

int i = 0;

json::value arr = myjson[i]; //获取arr数组的第一个元素

 

5、利用迭代器获取json的key。(有时候并不知道json的key,这个时候可以利用迭代器获取json的key)

json::value myjson = getjsonfromfile(“test.json”);//利用上面的函数生成一个json。

json::value::members members(myjson.getmembernames());

for (json::value::members::iterator it = members.begin(); it != members.end(); it)  {
const std::string &key = *it;
}

6、自己拼装json数组,(有时候发往服务器的数据是一个json数据)

json::value arr;

for(int i = 0 ;i < 5; i){

json::value myjson = getjsonfromfile(“test.json”);//利用上面的函数生成一个json。

arr.append(protocoldata);

}

如果想让这个jsonarr有key。

json::value arr2;

arr2["array"] = arr;

网站地图