JsonCpp:http://jsoncpp.sourceforge.net/
下載:http://sourceforge.net/projects/jsoncpp/files/
使用 JsonCpp 時,先將 JsonCpp 編譯成 lib 檔。
- 將下載的 JsonCpp 解壓縮,我解壓縮到 D:\jsoncpp-src-0.5.0
- 啟動 VS2012,「檔案」->「開啟專案」,
到 D:\jsoncpp-src-0.5.0\makefiles\vs71 開啟 jsoncpp.sln,
VS2012 會進行單向升級,以便 VS2012能夠開啟。 - 編譯時若出錯,依下列步驟修改。(以下我是編譯成 Release 版)
- 若出現以下警告訊息
[錯誤清單]訊息
警告 1 warning MSB8012: TargetPath(D:\jsoncpp-src-0.5.0\makefiles\vs71\../../build/vs71/release/lib_json\lib_json.lib) does not match the Library's OutputFile property value (D:\jsoncpp-src-0.5.0\build\vs71\release\lib_json\json_vc71_libmt.lib). This may cause your project to build incorrectly. To correct this, please make sure that $(OutDir), $(TargetName) and $(TargetExt) property values match the value specified in %(Lib.OutputFile). C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppBuild.targets 1299 5 lib_json警告 2 warning MSB8012: TargetName(lib_json) does not match the Library's OutputFile property value (json_vc71_libmt). This may cause your project to build incorrectly. To correct this, please make sure that $(OutDir), $(TargetName) and $(TargetExt) property values match the value specified in %(Lib.OutputFile). C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppBuild.targets 1301 5 lib_json
[輸出]訊息
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppBuild.targets(1299,5): warning MSB8012: TargetPath(D:\jsoncpp-src-0.5.0\makefiles\vs71\../../build/vs71/release/lib_json\lib_json.lib) does not match the Library's OutputFile property value (D:\jsoncpp-src-0.5.0\build\vs71\release\lib_json\json_vc71_libmt.lib). This may cause your project to build incorrectly. To correct this, please make sure that $(OutDir), $(TargetName) and $(TargetExt) property values match the value specified in %(Lib.OutputFile).
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppBuild.targets(1301,5): warning MSB8012: TargetName(lib_json) does not match the Library's OutputFile property value (json_vc71_libmt). This may cause your project to build incorrectly. To correct this, please make sure that $(OutDir), $(TargetName) and $(TargetExt) property values match the value specified in %(Lib.OutputFile).
解決方式:
在「lib_json」專案上按「右鍵」->「屬性」->「組態屬性」->「管理員」->「一般」->「輸出檔」->原本是「$(OutDir)json_vc71_libmt.lib」->改選「從父代或專案預設值繼承」。
如下圖:
- 若出現以下錯誤訊息
[錯誤清單]訊息
錯誤 1 error C1083: 無法開啟編譯器中產生的檔案: '../../build/vs71/release/lib_json\json_value.asm': Permission denied D:\jsoncpp-src-0.5.0\src\lib_json\json_value.cpp 1 1 test_lib_json
錯誤 2 error LNK1257: 無法產生程式碼 D:\jsoncpp-src-0.5.0\makefiles\vs71\LINK test_lib_json
[輸出]訊息
3>D:\jsoncpp-src-0.5.0\src\lib_json\json_value.cpp : fatal error C1083: 無法開啟編譯器中產生的檔案: '../../build/vs71/release/lib_json\json_value.asm': Permission denied
3>LINK : fatal error LNK1257: 無法產生程式碼
解決方式:
在「lib_json」專案上按「右鍵」->「屬性」->「組態屬性」->「C/C++」->「輸出檔」->「組合語言輸出」->原本是「具原始程式碼的組譯碼 (/FAs)」->改選「未列出」
如下圖: - 修改到這邊,應該可以正常編譯了。
注意,編譯後得到的是 Release 版 、MT的,我下載的 JsonCpp 預設是編譯成 MT,
若要改成 MD,可如下修改
在專案上按「右鍵」->「屬性」->「組態屬性」->「C/C++」->「程式碼產生」->「執行階段程式庫」->改成「多執行緒 DLL (/MD)」
(我是將「jsontest」、「lib_json」、「lib_json」都同時改為 MT,或同時改為 MD)
如下圖為修改「lib_json」專案 - 編譯完,產生的 D:\jsoncpp-src-0.5.0\build\vs71\release\lib_json\lib_json.lib 這個檔,即是我們要的檔
(若忽略前面第4點的警告訊息,則不是產生 lib_json.lib,而是 json_vc71_libmt.lib) - 以上是產生 release 版本的 lib。
若工作的專案,使用這個 release 版本的 lib,但是在編譯時,選 debug 模式,則會產生 _ITERATOR_DEBUG_LEVEL 不符合的錯誤。
錯 誤 3 error LNK2038: 偵測到 '_ITERATOR_DEBUG_LEVEL' 不符: '0' 值與 '2' 值 (位於 json2.obj) 不符 D:\VStest\json2\json2\lib_json.lib(json_value.obj) json2
錯誤 4 error LNK2038: 偵測到 'RuntimeLibrary' 不符: 'MD_DynamicRelease' 值與 'MDd_DynamicDebug' 值 (位於 json2.obj) 不符 D:\VStest\json2\json2\lib_json.lib(json_value.obj) json2
錯誤 5 error LNK2038: 偵測到 '_ITERATOR_DEBUG_LEVEL' 不符: '0' 值與 '2' 值 (位於 json2.obj) 不符 D:\VStest\json2\json2\lib_json.lib(json_reader.obj) json2
錯誤 6 error LNK2038: 偵測到 'RuntimeLibrary' 不符: 'MD_DynamicRelease' 值與 'MDd_DynamicDebug' 值 (位於 json2.obj) 不符 D:\VStest\json2\json2\lib_json.lib(json_reader.obj) json2
錯誤 7 error LNK2038: 偵測到 '_ITERATOR_DEBUG_LEVEL' 不符: '0' 值與 '2' 值 (位於 json2.obj) 不符 D:\VStest\json2\json2\lib_json.lib(json_writer.obj) json2
錯誤 8 error LNK2038: 偵測到 'RuntimeLibrary' 不符: 'MD_DynamicRelease' 值與 'MDd_DynamicDebug' 值 (位於 json2.obj) 不符 D:\VStest\json2\json2\lib_json.lib(json_writer.obj) json2
解決方式:
重新在 debug 模式下編譯一個 debug 用的 lib_json.lib
(執行階段程式庫,則改選 MTd 或 MDd)
參考:http://stackoverflow.com/questions/4061929/help-with-linker-error-lnk2038
- 使用時,
a.將 D:\jsoncpp-src-0.5.0\include\json 資料夾,複製到專案目錄下
b.將 lib_json.lib 複製到專案目錄下,例如 lib/lib_json.lib
範例:(注意專案的執行階段程式庫設定(MD、MT、MDd、MTd),須和前面編譯 jsoncpp 的設定一樣 )12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970#include "stdafx.h"
#include "json/json.h"
#pragma comment(lib,"lib/lib_json.lib")
#include "string"
using
namespace
std;
int
_tmain(
int
argc, _TCHAR* argv[])
{
Json::Reader reader;
Json::Value root;
//解析 JSON:範例1
string json_str =
"{\"aa\":\"test123\",\"bb\":\"test456\"}"
;
if
(reader.parse(json_str,root,
false
)){
cout <<
"aa:"
<< root[
"aa"
].asString() <<endl;
//aa:test123
cout <<
"bb:"
<< root[
"bb"
].asString() <<endl;
//bb:test456
}
//解析 JSON:範例2
string json_str2 =
"{\"aa\":\"aa99\",\"arr\":[{\"m1\":\"v1\"},{\"m2\":\"v2\"}]}"
;
if
(reader.parse(json_str2, root))
{
string str = root[
"aa"
].asString();
cout << str << std::endl;
//aa99
Json::Value arrayObj = root[
"arr"
];
for
(unsigned
int
i = 0; i < arrayObj.size(); i++)
{
if
(arrayObj[i].isMember(
"m1"
)) str = arrayObj[i][
"m1"
].asString();
//v1
if
(arrayObj[i].isMember(
"m2"
)) str = arrayObj[i][
"m2"
].asString();
//v2
cout << str << endl;
}
}
//序列化為 JSON:範例
Json::Value myroot;
Json::Value myarr;
Json::Value myitem;
myitem[
"aa"
] = 123;
myitem[
"bb"
] =
"b456"
;
myarr.append(myitem);
myroot[
"test"
] =
"vv"
;
myroot[
"arr"
] = myarr;
//輸出方式 1
string str = myroot.toStyledString();
//輸出帶格式的JSON字串
cout << str;
/* 輸出結果
{
"arr" : [
{
"aa" : 123,
"bb" : "b456"
}
],
"test" : "vv"
}
*/
//輸出方式 2
Json::FastWriter writer;
string str2 = writer.write(myroot);
//輸出不帶格式的JSON字串
cout << str2;
//{"arr":[{"aa":123,"bb":"b456"}],"test":"vv"}
getchar
();
return
0;
}
我問題八終於解決了,非常感謝您呦^_^
回覆刪除