編譯jsoncpp
A. VS2017編譯jsoncpp我出現的問題及怎麼解決的
文件-新建-項目-選c++-win32控制台程序-一步一步向下,完成新建後,再看解決方案管理器,樹狀結構最下面有個「源代碼」文件夾,如果裡面已經有cpp,就粘貼你的代碼,如果沒有,就右鍵-新建cpp源文件,再粘貼代碼,然後才能編譯。如果你都沒看到這些菜單的話說明你的vs2017沒裝c++相關的組件。
B. JSON中數組該如何解析呢c++中使用jsoncpp
JSON是一個輕量級的數據定義格式,比起XML易學易用,而擴展功能不比XML差多少,用之進行數據交換是一個很好的選擇
JSON的全稱為:javaScript Object Notation ,顧名思義,JSON是用於標記javascript對象的,詳情參考http://www.json.org/。
本文選擇第三方庫JsonCpp來解析json,JsonCpp是比較出名的c++解析庫,在json官網也是首推的。
JsonCpp簡介
JsonCpp主要包含三種類型的class:Value Reader Writer。
jsoncpp中所有對象、類名都在namespace json中,包含json.h即可。
注意: Json::Value只能處理ANSI類型的字元串,如果C++程序使用Unicode編碼的,最好加一個Adapt類來適配。
下載和編譯
本文運行環境是: Redhat 5.5 + g++version 4.6.1 + GNU Make 3.81 + jsoncpp-0.5.0
下載地址是:http://sourceforge.net/projects/jsoncpp/
解壓之後得到jsoncpp-src-0.5.0文件夾,我們只需要jsoncpp的頭文件和cpp文件,其中jsonscpp的頭文件位於jsoncpp-src-0.5.0includejson,jsoncpp的cpp文件位於jsoncpp-src-0.5.0srclib_json。
這里我列出我們的工作目錄:
jsoncpp/ //工作目錄
|-- include //頭文件根目錄
| |-- json //json頭文件,對應jsoncpp-src-0.5.0includejson
|-- src //cpp源碼文件根目錄
|-- json //jsoncpp源碼文件,對應jsoncpp-src-0.5.0srclib_json
|-- main.cpp //我們的主函數,調用jsoncpp的示例代碼
|-- makefile //makefile,不用我們多說了吧,不懂請看我博客的makefile最佳實踐
反序列化Json對象
假設有一個json對象如下:
{ "name": "json″, "array": [ { "cpp": "jsoncpp" }, { "java": "jsoninjava" }, { "php": "support" } ] }
我們要實現這個json的反序列號代碼如下:
voidreadJson() { usingnamespacestd; std::stringstrValue = "{\"name\":\"json\",\"array\":[{\"cpp\":\"jsoncpp\"},{\"java\":\"jsoninjava\"},{\"php\":\"support\"}]}"; Json::Reader reader; Json::Value value; if(reader.parse(strValue, value)) { std::stringout= value["name"].asString(); std::cout <<out<<std::endl; constJson::Value arrayObj = value["array"]; for(unsigned inti = 0;i <arrayObj.size(); i++) { if(!arrayObj[i].isMember("cpp")) continue; out= arrayObj[i]["cpp"].asString(); std::cout <<out; if(i != (arrayObj.size() - 1)) std::cout <<std::endl; } } }
序列化Json對象
voidwriteJson() { usingnamespacestd; Json::Value root; Json::Value arrayObj; Json::Value item; item["cpp"] = "jsoncpp"; item["java"] = "jsoninjava"; item["php"] = "support"; arrayObj.append(item); root["name"] = "json"; root["array"] = arrayObj; root.toStyledString(); std::stringout= root.toStyledString(); std::cout <<out<<std::endl; }
C. 怎麼將jsoncpp編譯成lib文件
比如你在VC6.0有一個工程project,裡面有以下3個文件
/*1*/fun.h
#ifndef FUN_H
#define FUN_H
void fun();
#endif
/*2*/fun.c
#include <stdio.h>
#include "fun.h"
void fun()
{
printf("fun()");
}
/*3*/main.c
#include <stdio.h>
#include "fun.h"
int main()
{
fun();
getchar();
}
菜單project->setting->link
把輸出文件名「Debug/project.exe」改成「Debug/project.lib」,確定
按F7組建project.lib
這樣在你的project\Debug文件夾下就可以找到project.lib了
D. jsoncpp linux下怎麼編譯
# tar zxvf scons-2.1.0.tar.gz
# tar zxvf jsoncpp-src-0.5.0.tar.gz
設定環境變數【關鍵】,絕對路徑
# export MYSCONS=解壓的路徑
# export SCONS_LIB_DIR=$MYSCONS/engine
# cd jsoncpp-src-0.5.0
# python $MYSCONS/script/scons platform=linux-gcc
編譯成功後,在在jsoncpp-src-0.5.0/libs/目錄下找到相應的*.a和*.so
可以修改為:mv libjson_linux-gcc-4.4.6_libmt.so libjson.so
頂
0
踩
E. linux下jsoncpp-src-0.5.0.tar.gz怎麼用指令安裝
jsoncpp-src-0.5.0.tar.gz這是一個源文件包。
所以要自己手動編譯,安裝。
Step1: 解壓
tarzxvfjsoncpp-src-0.5.0.tar.gz
Step2: 編譯和安裝(一般都是如此安裝,如果configure失敗,請根據提示安裝依賴)
cd解壓後的路徑
./configure--prefix=安裝路徑(絕對路徑)。
make
makeinstall
這一步做完, 可執行文件和頭文件等已到 「安裝路徑」。
Step3:執行程序
cd安裝路徑
找到可執行文件, 即可執行。
F. c++ 編譯問題
這個問題是你的編譯命令寫錯了,你給出了頭文件的地址和庫文件的地址,但是你鏈接的時候沒有給出lib所在的地址,你的編譯命令應該寫成如下形式:
$(CC) $(FLAGS) test2.c -I$(JSON_H) -L$(JSON_LIB) -l****
其中***表示的是你要鏈接的庫的名字,比如你要鏈接的庫是libjson.so(這是linux的形式,windows下是.lib)
那麼***就寫成json,其中***前面的是-l(L小寫,不是i的大寫)
這樣你就能鏈接成功了
G. jsoncpp和rapidjson哪個好用
程序員的秘訣是:編程、編程、再編程。
簡單性
真的對這個問題一竅不通,但是專人說:Rapidjson是全部都在第一個總文件里,jsoncpp要求您構建或編譯一個庫;但rapidjson的一些介面不全,只提供了一層一層的這種解析方式,不能將某一層一次讀出來,實際用的時候,要簡單封裝一下,不然代碼量會很大。
總結
其實這種類似程序的東西我真的毫無涉獵,不過以後可以嘗試看看。這個庫使用了大量c++ 11標准元素,並且庫的設計也符合一些STL標准,可配置性比較強;單文件方式,引用也比較方便;使用上,也有其獨到的地方,更接近JSON的本質;此外性能上還是不錯的,只是比rapidjson差,比libjson,jsoncpp之流還是強了不少
H. 怎麼在VS2008里使用jsoncpp
C++要使用JSON來解析數據,一般採用jsoncpp.
下載jsoncpp後,按ReadMe文檔的說法是要先安裝的,但是安裝比較麻煩。然而事實上,我們並不需要安裝,就可以直接使用。
方法一:直接拷貝源文件。這個方法比較簡單,但不推薦,因為不便於項目管理。
VS2008里新建一個空的控制台程序(用作測試jsoncpp是否可用),名為: TestJSON
解壓下載好的文件:jsoncpp-src-0.5.0.tar.gz
將 jsoncpp-src-0.5.0include 目錄下的json文件夾拷貝至 TestJSON 工程目錄下
將jsoncpp-src-0.5.0srclib_json 目錄下的所有.h, .cpp文件全部拷貝至 TestJSON 工程目錄下
在VS2008里引入工程目錄下剛剛從jsoncpp-src-0.5.0 導入的文件,如圖1
在VS2008里新建main.cpp來測試jsoncpp是否可用。代碼見文章末尾main.cpp
方法二:使用靜態鏈接庫
VS2008里新建一個空的控制台程序(用作測試jsoncpp是否可用),名為: TestJSON
解壓下載好的文件:jsoncpp-src-0.5.0.tar.gz
利用VS2008打開jsoncpp-src-0.5.0makefilesvs71目錄下的jsoncpp.sln,會出現三個Project:jsontest,lib_json,test_lib_json
在lib_json上 右擊-->Properties-->Configuration Properties-->C/C++-->Code Generation,注意右側的Runtime Library的內容,如圖2,看完箭頭所指的東西就可以點確定,關掉屬性頁。
編譯lib_json,顯示編譯成功後,在jsoncpp-src-0.5.0uildvs71debuglib_json目錄下會生成一個json_vc71_libmtd.lib,將這個lib拷貝至TestJSON工程目錄下。
將jsoncpp-src-0.5.0includejson目錄下的所有.h文件拷貝至TestJSON工程目錄下,並在工程Header Files引入.
將方法一里的main.cpp添加到工程中,並在工程名上 右擊-->Properties-->Configuration Properties-->C/C++-->Code Generation, 將Runtime Library改成圖2箭頭所示內容。
在工程名上右擊-->Properties-->Configuration Properties-->Linker-->Input, 在Additional Dependencies里填寫json_vc71_libmtd.lib,然後確定,編譯就行了。
/* 測試jsoncpp的使用
*/
#include<iostream>
#include"json/json.h"
usingnamespacestd;
usingnamespaceJson;//json的命名空間
intmain()
{
/*JSONDATAasfollowing://一個json類型的數據
{
"test:5
}*/
stringtest="{"test":5}";//保存上文的json類型的數據
//以下涉及json的操作,將在後文中涉及,此處為簡單應用,不解釋,你懂的
Readerreader;
Valuevalue;
if(reader.parse(test,value))
{
inti=0;
if(!value["test"].isNull())
{
i=value["test"].asInt();
cout<<i<<endl;
}
}
return0;
}
I. C++ json解析
C++ 解析Json——jsoncpp
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,和xml類似,本文主要對VS2008中使用Jsoncpp解析json的方法做一下記錄。
Jsoncpp是個跨平台的開源庫,下載地址:http://sourceforge.net/projects/jsoncpp/,我下載的是v0.5.0,壓縮包大約104K。
方法一:使用Jsoncpp生成的lib文件
解壓上面下載的Jsoncpp文件,在jsoncpp-src-0.5.0/makefiles/vs71目錄里找到jsoncpp.sln,用VS2008版本編譯,默認生成靜態鏈接庫。 在工程中引用,只需要包含include/json下的頭文件及生成的.lib文件即可。
如何包含lib文件:在.cpp文件中#pragma comment(lib."json_vc71_libmt.lib"),在工程屬性中Linker下Input中Additional Dependencies寫入lib文件名字(Release下為json_vc71_libmt.lib,Debug為json_vc71_libmtd.lib)
注意:Jsoncpp的lib工程編譯選項要和VS工程中的編譯選項保持一致。如lib文件工程編譯選項為MT(或MTd),VS工程中也要選擇MT(或MTd),否則會出現編譯錯誤問題,debug和release下生成的lib文件名字不同,注意不要看錯了,當成一個文件來使用(我就犯了這個錯誤)。
方法二:使用Jsoncpp包中的.cpp和.h文件
解壓上面下載的Jsoncpp文件,把jsoncpp-src-0.5.0文件拷貝到工程目錄下,將jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\include\json和jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\src\lib_json目錄里的文件包含到VS工程中,在VS工程的屬性C/C++下General中Additional Include Directories包含頭文件目錄.\jsoncpp-src-0.5.0\include。在使用的cpp文件中包含json頭文件即可,如:#include "json/json.h"。將json_reader.cpp、json_value.cpp和json_writer.cpp三個文件的Precompiled Header屬性設置為Not Using Precompiled Headers,否則編譯會出現錯誤。
jsoncpp 使用詳解
jsoncpp 主要包含三種類型的 class:Value、Reader、Writer。jsoncpp 中所有對象、類名都在 namespace Json 中,包含 json.h 即可。
Json::Value 只能處理 ANSI 類型的字元串,如果 C++ 程序是用 Unicode 編碼的,最好加一個 Adapt 類來適配。
下面是從網上找的代碼示例:
1. 從字元串解析json
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
}
2. 從文件解析json
int ReadJsonFromFile(const char* filename)
{
Json::Reader reader;// 解析json用Json::Reader
Json::Value root; // Json::Value是一種很重要的類型,可以代表任意類型。如int, string, object, array
std::ifstream is;
is.open (filename, std::ios::binary );
if (reader.parse(is, root, FALSE))
{
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();
code = root.get("uploadid", "null").asString();// 訪問節點,Return the member named key if it exist, defaultValue otherwise.
int file_size = root["files"].size(); // 得到"files"的數組個數
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();
printf("type : %s, url : %s \n", type.c_str(), url.c_str());
}
}
}
is.close();
return 0;
}
3. 向文件中插入json
void WriteJsonData(const char* filename)
{
Json::Reader reader;
Json::Value root; // Json::Value是一種很重要的類型,可以代表任意類型。如int, string, object, array
std::ifstream is;
is.open (filename, std::ios::binary );
if (reader.parse(is, root))
{
Json::Value arrayObj; // 構建對象
Json::Value new_item, new_item1;
new_item["date"] = "2011-11-11";
new_item1["time"] = "11:11:11";
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中
std::string out = root.toStyledString();
// 輸出無格式json字元串
Json::FastWriter writer;
std::string strWrite = writer.write(root);
std::ofstream ofs;
ofs.open("test_write.json");
ofs << strWrite;
ofs.close();
}
is.close();
}