首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

JSONCPP引见及使用

2013-03-28 
JSONCPP介绍及使用一、JSON简介JSON全称为JavaScript ObjectNotation,它是一种轻量级的数据交换式,易于阅读

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"

实现

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 UNICODEstd::wstring stemp = s2ws(rtnOut); LPCWSTR result = stemp.c_str();#elseLPCWSTR result = rtnOut.c_str();#endifMessageBox(result,_T("根据JSON串,生成的对应JSON串信息"));CEdit* pEdit =(CEdit*)GetDlgItem(IDC_EDIT2);   pEdit->SetWindowText(result);  }else{CEdit* pRtnEdit =(CEdit*)GetDlgItem(IDC_EDIT2);   pRtnEdit->SetWindowText(_T("JSON格式错误"));  }}

 

将JSONCPP以静态库方式导入,需要注意项目中的代码生成中的运行库,和JSONCPP的静态库项目的代码生成的运行库要一致,否则将报如下错误

afxver_.h(81): fatal error C1189: #error :  Please use the /MD switch for _AFXDLL builds

项目中的Runtime Library需设置的一样

JSONCPP引见及使用

 

热点排行