MFC工程 vs2008 C++編譯JSONCPP 靜態庫

使用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"
}










發佈了103 篇原創文章 · 獲贊 5 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章