使用VS2008編譯jsoncpp源碼爲靜態庫,在自己工程中使用
1. VS2008
2. MFC工程下使用
3. JSON源碼,下載地址:
4. 解壓下載的問價:jsoncpp-src-0.5.0.tar.gz
5.打開源碼的工程E:\vs2008_project\json\jsoncpp-src-0.5.0\makefiles\vs71\jsoncpp.sln
6.生成Debug和Release版本的lib文件,步驟如下:
1>>打開頁面如下圖1.
2>>(Debug和Release模式方式一樣)右鍵lib_json項目->僅用於項目->僅生產lib_json
3>>再次右鍵lib_json項目->僅用於項目->僅鏈接lib_json
4>>生成lib文件在E:\vs2008_project\json\jsoncpp-src-0.5.0\build\vs71下
5>>注意:fatal error C1083: 無法打開編譯器生成的文件:“../../build/vs71/release/lib_json\json_writer.asm”: No such file or directory ,一般就是release版本的lib需要在屬性設置的時候:配置屬性->常規->項目默認值最下面兩項改成如圖所示.
7. 拷貝 E:\vs2008_project\json\jsoncpp-src-0.5.0\include文件的下的json文件到自己的工程下.
8. 拷貝剛生成的兩個lib(如默認名稱Debug版本json_vc71_libmtd.lib Release版本json_vc71_libmt.lib)到工程下.目錄任意
9.lib文件 + 頭文件.h 就可以添加到自己的工程下編譯了
1&& 項目->屬性->配置屬性->C/C++->常規->附加包含目錄(jsoncpp源碼的頭文件.h文件所在位置)
2&& 項目->屬性->配置屬性->鏈接器->常規->附加庫目錄(jsoncpp源碼剛生成json_vc71_libmtd.lib和json_vc71_libmt.lib的目錄)
3&& 項目->屬性->配置屬性->鏈接器->輸入->附加依賴項(Debug版本json_vc71_libmtd.lib/Release版本json_vc71_libmt.lib)
10.一般情況下會報錯,我的工程師MFC工程,而jsoncpp是win32控制檯工程,所以那面容易出錯
1## 錯誤如出現error LNK2005已定義.可修改 項目->屬性->配置屬性->常規->MFC的使用->在靜態庫中使用MFC
2## StdAfx.h沒有引用可以在 項目->屬性->配置屬性->C/C++->預編譯頭->不使用預編譯(/Yu)
3## 項目->屬性->配置屬性->C/C++->代碼生成-->運行時庫Debug:多線程調試(/MTD) 或者 Release:多線程調試(/MT)
11 .從文件中解析json.
CameraConfig是一個結構體,結構體類型和json轉換類型一定要一致,否則崩潰.
#define JN_bAlarm "bAlarm"
#define JN_bAutoStart "bAutoStart"
#define JN_mAlarmCru "mAlarmCru"
#define JN_mDevIndex "mDevIndex"
#define JN_mDevIp "mDevIp"
#define JN_mDevPWD "mDevPWD"
struct CameraConfig
{
bool bAlarm;
bool bAutoStart;
int mAlarmCru;
string mDevIndex;
string mDevIp;
string mDevPWD;
};
讀取文件解析json. filename是文件名字
vector<CameraConfig> parseJsonFromFile(const char* filename)
{
vector<CameraConfig> re;
FILE *file = fopen( filename, "rb" );
if ( !file )
{
return re;
}
fseek( file, 0, SEEK_END );
long size = ftell( file );
fseek( file, 0, SEEK_SET );
std::string text;
char *buffer = new char[size+1];
buffer[size] = 0;
if ( !fread( buffer, 1, size, file ) == (unsigned long)size )
{
return re;
}
text = buffer;
fclose( file );
delete[] buffer;
re = parseJsonFromString(text);
return re;
}
vector<CameraConfig> parseJsonFromString(const std::string str) ///傳入字符串解析
{
Json::Reader reader;
Json::Value root;
vector<CameraConfig> vecCamera;
if (!reader.parse(str, root)) // reader將Json字符串解析到root,root將包含Json裏所有子元素
{
return vecCamera;
}
int size = 0;
if (root.isArray())//根是否爲數組
{
size = root.size();
// 遍歷數組
for(int i = 0; i < size; ++i)
{
CameraConfig camera;
camera.bAlarm = root[i][JN_bAlarm].asBool();
camera.bAutoStart = root[i][JN_bAutoStart].asBool();
camera.mAlarmCru = root[i][JN_mAlarmCru].asInt();
camera.mDevIndex = root[i][JN_mDevIndex].asString();
camera.mDevIp = root[i][JN_mDevIp].asString();
camera.mDevPWD = root[i][JN_mDevPWD].asString();
vecCamera.push_back(camera);
}
}
else//根目錄不是數組時
{
CameraCongig camera;
camera.bAlarm = root[JN_bAlarm].asBool();
camera.bAutoStart = root[JN_bAutoStart].asBool();
camera.mAlarmCru = root[JN_mAlarmCru].asInt();
camera.mDevIndex = root[JN_mDevIndex].asString();
camera.mDevIp = root[JN_mDevIp].asString();
camera.mDevPWD = root[JN_mDevPWD].asString();
vecCamera.push_back(camera);
}
return vecCamera;
}
把內容保存在文件中,根目錄爲數組 : vecCamera保存數據,path保存文件路徑
void writeJsonFile(vector<CameraConfig> &vecCamera, const string &path)
{
Json::StyledWriter sw; //按照標準格式寫入
Json::Value root; //根爲數組
for (int i = 0; i < vecCamera.size(); i++)//循環加入數組內容到json節點中
{
root[i][JN_bAlarm] = Json::Value(vecCamera.at(i).bAlarm);
root[i][JN_bAutoStart] = Json::Value(vecCamera.at(i).bAutoStart);
root[i][JN_mAlarmCru] = Json::Value(vecCamera.at(i).mAlarmCru);
root[i][JN_mDevIndex] = Json::Value(vecCamera.at(i).mDevIndex);
root[i][JN_mDevIp] = Json::Value(vecCamera.at(i).mDevIp);
root[i][JN_mDevPWD] = Json::Value(vecCamera.at(i).mDevPWD);
}
ofstream os;
os.open(path.c_str());
os << sw.write(root); //寫入文件
os.close();
}
[ camera.cfg文件如下 根目錄爲數組,數組名字爲空
{
"bAlarm" : false,
"bAutoStart" : false,
"mAlarmCru" : 0,
"mDevIndex" : "小明",
"mDevIp" : "172.16.3.245",
"mDevPWD" : "12345",
},
{
"bAlarm" : false,
"bAutoStart" : false,
"mAlarmCru" : 0,
"mDevIndex" : "小王",
"mDevIp" : "172.16.3.248",
"mDevPWD" : "12345", }
]
<span style="font-size:24px;">//將信息保存爲JSON格式 ,內嵌套格式</span>
<pre name="code" class="cpp">
void writeFileJson()
{
//根節點
Json::Value root;
//根節點屬性
root["name"] = Json::Value("Mike Jiang");
root["age"] = Json::Value(23);
root["sex_is_male"] = Json::Value(true);
//子節點
Json::Value partner;
//子節點屬性
partner["partner_name"] = Json::Value("Galatea");
partner["partner_age"] = Json::Value(21);
partner["partner_sex_is_male"] = Json::Value(false);
//子節點掛到根節點上
root["partner"] = Json::Value(partner);
//數組形式
root["achievement"].append("ach1");
root["achievement"].append("ach2");
root["achievement"].append("ach3");
//直接輸出
cout << "FastWriter:" << endl;
Json::FastWriter fw;
cout << fw.write(root) << endl << endl;
//縮進輸出
cout << "StyledWriter:" << endl;
Json::StyledWriter sw;
cout << sw.write(root) << endl << endl;
//輸出到文件
ofstream os;
os.open("demo.json");
os << sw.write(root);
os.close();
}
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 //讀取文件test.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();
}
}
test.json文件如下
{
"uploadid": "UP000000",
"code": "0",
"msg": "",
"files":
[
{
"code": "0",
"msg": "",
"filename": "1D_16-35_1.jpg",
"filesize": "196690",
"width": "1024",
"height": "682",
"images":
[
{
"url": "fmn061/20111118",
"type": "large",
"width": "720",
"height": "479"
},
{
"url": "fmn061/20111118",
"type": "main",
"width": "200",
"height": "133"
}
]
}
]
}
插入後的文件test_W.json
{
"code" : "0",
"files" : [
{
"code" : "0",
"exifs" : [
{
"date" : "2011-11-11"
},
{
"time" : "11:11:11"
}
],
"filename" : "1D_16-35_1.jpg",
"filesize" : "196690",
"height" : "682",
"images" : [
{
"height" : "479",
"type" : "large",
"url" : "fmn061/20111118",
"width" : "720"
},
{
"height" : "133",
"type" : "main",
"url" : "fmn061/20111118",
"width" : "200"
}
],
"msg" : "",
"width" : "1024"
}
],
"msg" : "",
"uploadid" : "UP000000"
}