JSON (JavaScript Object Notation) 是一種輕量級的資料交換格式 --==- 附上可以編譯的程式
阿新 • • 發佈:2019-01-29
最近因為團隊需要
我做了一個爬蟲,爬蟲的需求很簡單
1. Login 網頁->得到資料->分析->傳送一個請求命令
主要的資料全是Json , 近期整理出來,關於部分資料的整理
Python 準備融合到C++裡面,這樣我就可以減輕HTTP那些噁心的c++封裝,純屬偷懶
下面這小段程式是官方的,編譯不過,如果你有編譯過的,記得抄送我一份
const Json::Value plugins = root["plug-ins"];
for ( int index = 0; index < plugins.size(); ++index ) // Iterates over the sequence elements.
loadPlugIn( plugins[index].asString() );
setIndentLength( root["indent"].get("length", 3).asInt() );
setIndentUseSpace( root["indent"].get("use_space", true).asBool()
上面這段Code Example 真是...
下面上程式碼
設計思路: 生成一個Json檔案->存檔->讀取(普通 和 陣列都有)
// jsonLibRe.cpp : 定義控制檯應用程式的入口點。
//
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
#include "json.h"
TCHAR szFullConfName[2*MAX_PATH + 1] = {0};
void saveStringToFile(std::string szSaveString)
{
TCHAR szFilePath[MAX_PATH + 1]; GetModuleFileName(NULL, szFilePath, MAX_PATH);
(_tcsrchr(szFilePath, _T('\\')))[1] = 0;//刪除檔名,只獲得路徑
TCHAR str_url[2*MAX_PATH + 1] = {0};
lstrcat(str_url, szFilePath);lstrcat(str_url, _T("msg.json") );
//only for loglstrcat(szFullConfName, str_url);
//
std::ofstream otof(str_url); otof<< szSaveString;
otof.flush();otof.close();
}
int main(int argc, char* argv[])
{
//解析jsonJson::Value jsRoot;
Json::Value jsArray;Json::Value jsItem;
for (int i = 0; i < 10 ; i++ ){
jsItem["id"] = i;jsItem["Name"] = "農田";
jsArray.append(jsItem);}
jsRoot["FirstName"] = "Eagle";jsRoot["LastName"] = "Zhao";
std::string szShowCurrJSON = jsRoot.toStyledString();//std::cout<< szShowCurrJSON <<std::endl;
//std::cout<< "--==========================================--" <<std::endl;
//szShowCurrJSON.empty();//szShowCurrJSON = jsArray.toStyledString();
//std::cout<< szShowCurrJSON <<std::endl;//std::cout<< "--==========================================--" <<std::endl;
jsRoot["JSONArray"] = jsArray;szShowCurrJSON.empty();
szShowCurrJSON = jsRoot.toStyledString();//std::cout<< szShowCurrJSON <<std::endl;
std::cout<< "--==========================================--" <<std::endl;
//save JSON to filesaveStringToFile(szShowCurrJSON);
//--======================Reader file====================================--// Reader file and show Json
Json::Value jsReadValue;std::ifstream in(szFullConfName);
std::string szReadstr;std::string szReadmsg;
if(in.is_open()){
while(in>>szReadstr)szReadmsg += szReadstr;
}
Json::Reader jsReader;
int ret = jsReader.parse(szReadmsg,jsReadValue);
if(ret){
std::string FN = jsReadValue["FirstName"].asString();std::string LN = jsReadValue["LastName"].asString();
std::cout<<FN <<std::endl;std::cout<<LN <<std::endl;
/**[["key1":value1],["key2":value2] ]
**/Json::Value jsArrayReaderValue ;
jsArrayReaderValue = jsReadValue["JSONArray"];int iASize = jsArrayReaderValue.size();
for ( int i=0; i < iASize;i++ ){
int nID = jsArrayReaderValue[i]["id"].asInt();std::string szName = jsArrayReaderValue[i]["Name"].asString();
std::cout<<szName <<nID << std::endl;}
}
in.close();return 0;
}
/**
//////////////本文設計的Jason 檔案內容,程式會自動生成://////////////
{
"FirstName" : "Eagle",
"JSONArray" : [
{
"Name" : "農田",
"id" : 0
},
{
"Name" : "農田",
"id" : 1
},
{
"Name" : "農田",
"id" : 2
},
{
"Name" : "農田",
"id" : 3
},
{
"Name" : "農田",
"id" : 4
},
{
"Name" : "農田",
"id" : 5
},
{
"Name" : "農田",
"id" : 6
},
{
"Name" : "農田",
"id" : 7
},
{
"Name" : "農田",
"id" : 8
},
{
"Name" : "農田",
"id" : 9
}
],
"LastName" : "Zhao"
}
/////////////////////////////////////////////////////////////////////////////
下面的收集來自與網路
http://api.minicloud.com.cn/statuses/public_timeline.json返回的格式為無名陣列。
那麼又該如何解析呢?
參考程式碼如下
reader.parse(apiret,value);
for(int i = 0;i < value.size();++i)
{string text = value[i]["text"].asString();
cout<<text<<endl;}
json對陣列的解析還支援STL的風格。即
Json::Value::Members member;//Members 這玩意就是vector<string>,typedef了而已for (Json::Value::iterator itr = objArray.begin(); itr != objArray.end(); itr++)
{member = (*itr).getMemberNames();
for (Json::Value::Members::iterator iter = member.begin(); iter != member.end(); iter++){
string str_temp = (*itr)[(*iter)].asString();}
}
**/