C++的Json解析库:jsoncpp

JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org,本文不再对json做介绍,将重点介绍c++的json解析库的使用方法。
一. 使用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
[cpp] view plain copy

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文件内容:
[cpp] view plain copy

{  
    "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"  
                }  
            ]  
        }  
    ]  
} 

解析代码:
[cpp] view plain copy

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
[cpp] view plain copy

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
[cpp] view plain copy

// 转换为字符串(带格式)  
std::string out = root.toStyledString();  
// 输出无格式json字符串  
Json::FastWriter writer;  
std::string out2 = writer.write(root);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值