当前位置:编程学习 > JS >>

C++解析JSON之JsonCPP

一、JSON简介
 
JSON全称为JavaScript ObjectNotation,它是一种轻量级的数据交换格式,易于阅读、编写、解析。
 
JSON由两种基本结构构成:
 
1)"名称/值"对的集合,可以理解为对象。
 
2)值的组合,可以理解为数组。
 
JSON对象简单示例
 
示例1:
 
{
 
   "header": {
 
     "pid": "10",
 
     "cas": "1"
 
   },
 
   "body": {
 
     "bodyCode": "JSON",
 
     "bodyName":"JavaScriptObject Notation",
 
     "GUId": "1"
 
   }
 
}
 
示例2:
 
{
 
   "header": {
 
     "pid": "10",
 
     "cas": "1"
 
   },
 
   "ack": [{
 
     "ackCode": "JSON",
 
     "ackName":"JavaScript ObjectNotation",
 
   },{
 
     "ackCode": "JSON",
 
     "ackName":"JavaScript ObjectNotation",
 
   }
 
   "GUId":"1"
 
}
 
JSON更详细的介绍请看官网:http://www.json.org
 
二、JSONCPP
 
1.     JsonCPP简介
 
      jsoncpp是c++解析JSON串常用的解析库之一。其常用的类有:
 
a)     Json::Value     可以表示里所有的类型,比如int,string,object,array等,其支持的类型可以参考Json:ValueType中的值。
 
b)     Json::Reader   将json文件流或字符串解析到Json::Value,主要函数有Parse。
 
c)     Json::Writer    与Json::Reader相反,将Json::Value转化成字符串流,注意它的两个子类:Json::FastWriter和Json::StyleWriter,分别输出不带格式的json和带格式的json。
 
d)     Json::Value::Members 主要用于以STL风格解析JSON数组。看过源代码的人已知道,Members其实是typedefvector<string>而已。
 
2.     JSONCPP解析示例
 
a)    解析JSON串格式
 
{
 
  "JsonID" : "BD6D7FDA-54D2-468b-A3DE-9D5FBDB78207",
 
  "Send" : {
 
     "ID" : "B8E09E97-F379-4bb0-814A-389FD3F66631",
 
     "Items" : [
 
        {
 
           "Count" : 2,
 
           "Code" : "0101",
 
           "X" : 1,
 
           "Y" : 2
 
        },
 
        {
 
           "Count" : 2,
 
           "Code" : "0101",
 
           "X" : 1,
 
           "Y" : 2
 
        }
 
      ]
 
   }
 
}
 
b)    生成的JSON串
 
{
 
  "Ack" : [
 
      {
 
        "ActualCount" : 2,
 
        "Code" : "0101"
 
     },
 
      {
 
        "ActualCount" : 2,
 
        "Code" : "0101"
 
      }
 
   ],
 
  "JsonID" : "BD6D7FDA-54D2-468b-A3DE-9D5FBDB78207"
 
}
 
 
 
c)        解析、生成JSON代码
 
需要引入的.h文件
 
#pragma once  
#pragma comment(lib, "json_vc71_libmtd.lib")  
   
#include "json/json.h"  
实现

[cpp] view plaincopy 
void CJSONTestDlg::OnBnClickedButton1()  
{  
    CEdit* pEdit =(CEdit*)GetDlgItem(IDC_EDIT1);  
    CString str;   
    pEdit->GetWindowText(str); //str即为a)中定义的JSON串  
    pEdit->FmtLines(true);  
  
    Json::Reader reader;  
    Json::Value root;  
  
    if (reader.parse(WC2UT(str.GetBuffer(0)), root))  // reader将Json字符串解析到root,root将包含Json里所有子元素  
    {  
        std::string JsonID = root["JsonID"].asString();   
        Json::Value rtnRoot;  
        rtnRoot["JsonID"]=JsonID;  
  
        Json::Value ack;  
        Json::Value send = root["Send"];  
        if(!send["Items"].isNull()){  
            Json::Value Items = send["Items"];  
            int sendSize = Items.size();  
  
            for(int i=0;i<sendSize;i++){//循环获取到JSON串数组当中的值  
                std::string  Code = Items[i]["Code"].asString();  
                int x = Items[i]["X"].asInt();  
                int y = Items[i]["Y"].asInt();  
                int count = Items[i]["Count"].asInt();  
                  
                //更具读到的JSON串中的值生成所需内容  
                Json::Value newAckItem;  
                newAckItem["Code"]=Code;  
                newAckItem["ActualCount"]=count;  
  
                ack.append(newAckItem);  
            }  
        }  
        rtnRoot["Ack"]=ack;  
        std::string rtnOut = rtnRoot.toStyledString();//生成带格式的JSON串  
#ifdef UNICODE  
        std::wstring stemp = s2ws(rtnOut);   
        LPCWSTR result = stemp.c_str();  
#else  
        LPCWSTR result = rtnOut.c_str();  
#endif  
        MessageBox(result,_T("根据JSON串,生成的对应JSON串信息"));  
        CEdit* pEdit =(CEdit*)GetDlgItem(IDC_EDIT2);     
        pEdit->SetWindowText(result);    
    }else{  
        CEdit* pRtnEdit =(CEdit*)GetDlgItem(IDC_EDIT2);     
        pRtnEdit->SetWindowText(_T("JSON格式错误"));    
    }  
}  

 

 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,