<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
JSON是一種純字串形式的資料,它本身不提供任何方法(函數),非常適合在網路中進行傳輸。JavaScript、PHP、Java、Python、C++等程式語言都內建了處理JSON資料的方法。
JSON 是基於 JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一個子集,是一種開放的、輕量級的資料交換格式,採用獨立於程式語言的文字格式來儲存和表示資料,易於程式設計師閱讀與編寫,同時也易於計算機解析和生成,通常用於在 Web 使用者端(瀏覽器)與 Web 伺服器端之間傳遞資料。
在JSON中,使用一下兩種方式表示資料:
{}
定義。在每個鍵/值對中,以鍵開頭,後跟一個冒號:
,最後是值。多個鍵/值對之間使用逗號,
分隔,例如"name":"FilterWindow","paramtype":"0"
。[]
定義,陣列中每個值之間使用逗號,
進行分隔。下面展示一個簡單的JSON資料:
{ "name" : "FilterWindow", "paramtype" : "0", "range" : { "max" : 99, "min" : 3 }, "required" : true, "title" : "濾波視窗大小", "type" : "int", "value" : 51 "tempValue" : [ "不生成" : 1, "生成" : 0 ], }
優點:
相對於txt,word來說,json格式更加明確,獲取重要資訊非常方便。
相對於xml來說,json格式更加簡潔,儲存同樣的檔案,花費的記憶體更小。
相對於Excel來說,json更適合儲存字元類檔案。Excel相當於比較簡單的資料庫了。
相對於資料庫來說,json更加方便,資料庫我們還需要做一些設定,安裝一些軟體。json可以直接使用。
缺點:
只有一種數位型別:JSON中只能支援IEEE-754雙精度浮點格式,因此我們無法使用JSON來儲存許多程式語言中多樣化的數位型別;
沒有日期型別:在JSON中我們只能通過日期的字串(例如:1970-01-01)或者時間戳(例如:1632366361)來表示日期;
沒有註釋:在JSON中無法新增註釋;
冗長:雖然JSON比XML更加簡潔,但它不是最簡潔的資料交換格式,對於資料量龐大或用途特殊的服務,我們需要更加高效的資料格式。
JSON資料可以儲存在.json格式的檔案中(與.txt格式類似,都屬於純文字檔案),也可以將JSON資料以字串的形式儲存在資料庫、Cookie、Session中。要使用儲存好的JSON資料也非常簡單,不同的程式語言中提供了不同的方法來檢索和解析JSON資料,今天我們的重點就是使用C++來操作.json檔案。而C++主要使用jsoncpp這個跨平臺的開源庫來實現對.json檔案的各類操作。
這裡我就不按照網上常規的方式來介紹了,常規的方法無非是關於下載jsoncpp庫,然後使用Windows編譯(vs2015),最後整理出include及lib來使用jsoncpp庫。我這裡是整理好的,是直接把include裡的所有檔案集合成json.h以及json.cpp。用的時候直接把這些檔案包含進自己的專案一起編譯即可。
jsoncpp主要包含三個class(類):Value、Reader、Writer。注意Json::Value只能處理ANSI型別的字串,如果C++程式是用Unicode編碼的,最好加一個Adapt類來適配。
Value: 是jsoncpp中最基本、最重要的類,用於表示各種型別的物件,jsoncpp支援的物件型別可見下面的Json::ValueType列舉值;Value類的物件代表一個JSON,既可以代表一個檔案,也可以代表檔案中一個值。如同JSON中定義的“值”一樣,Value是遞迴的。
enum ValueType { nullValue = 0, ///< 'null' value intValue, ///< signed integer value uintValue, ///< unsigned integer value realValue, ///< double value stringValue, ///< UTF-8 string value booleanValue, ///< bool value arrayValue, ///< array value (ordered list) objectValue ///< object value (collection of name/value pairs). };
Value類裡的函數如下所示:
1、【建構函式】 Value( ValueType type = nullValue ); Value( Int value ); Value( UInt value ); Value( double value ); Value( const char *value ); Value( const char *beginValue, const char *endValue ); 2、【拷貝建構函式】 Value( const StaticString &value ); Value( const std::string &value ); Value( const Value &other ); 3、【相同型別的比較、交換、型別的獲取】 void swap( Value &other ); ValueType type() const; int compare( const Value &other ); 4、【相應的賦值運運算元的過載函數】 Value &operator=( const Value &other ); bool operator <( const Value &other ) const; bool operator <=( const Value &other ) const; bool operator >=( const Value &other ) const; bool operator >( const Value &other ) const; bool operator ==( const Value &other ) const; bool operator !=( const Value &other ) const; bool operator!() const; Value &operator[]( UInt index ); const Value &operator[]( UInt index ) const; 5、【將Value物件進行相應的型別轉換】 const char *asCString() const; std::string asString() const; const char *asCString() const; std::string asString() const; Int asInt() const; UInt asUInt() const; double asDouble() const; 6、【相應的判斷函數】 bool isNull() const; bool isBool() const; bool isInt() const; bool isUInt() const; bool isIntegral() const; bool isDouble() const; bool isNumeric() const; bool isString() const; bool isArray() const; bool isObject() const; bool isConvertibleTo( ValueType other ) const; bool isValidIndex( UInt index ) const; bool isMember( const char *key ) const; bool isMember( const std::string &key ) const; 7、【清除和擴容函數】 void clear(); void resize( UInt size ); 8、【獲取滿足相應條件的Value】 Value get( UInt index, const Value &defaultValue ) const; Value get( const std::string &key,const Value &defaultValue ) const; Members getMemberNames() const; 9、【刪除滿足相應條件的Value】 Value removeMember( const char* key ); Value removeMember( const std::string &key ); 10、【】 void setComment( const char *comment,CommentPlacement placement ); void setComment( const std::string &comment,CommentPlacement placement ); bool hasComment( CommentPlacement placement ) const; std::string getComment( CommentPlacement placement ) const; std::string toStyledString()const;
Reader :是用於讀取的,確切說是用於將字串轉換為Json::Value物件的。
1、【建構函式】 Reader(); 2、【拷貝建構函式】 Reader( const Features &features ); 3、【將字串或者輸入流轉換為JSON的Value物件】【下邊是相應的parse的過載函數】 bool parse( const std::string &document, Value &root,bool collectComments = true ); bool parse(const char *beginDoc, const char *endDoc, Value &root,bool collectComments = true) bool parse( std::istream &is,Value &root,bool collectComments = true ); 4、【】 std::string getFormatedErrorMessages() const;
Writer :是一個純虛類,並不能直接使用。在此我們使用Json::Writer的子類(派生類):Json::FastWriter、Json::StyledWriter、Json::StyledStreamWriter。顧名思義,用Json::FastWriter來處理json應該是最快的;負責將記憶體中的Value物件轉換成JSON檔案,輸出到檔案或者字串中。
1、【FastWriter】 FastWriter(); virtual ~FastWriter(){} void enableYAMLCompatibility(); virtual std::string write( const Value &root ); 2、【StyledWriter】 StyledWriter(); virtual ~StyledWriter(){} virtual std::string write( const Value &root );
{ "face": [ { "attribute": { "age": { "range": 5, "value": 35 }, "gender": { "confidence": 99.9995, "value": "Male" }, "glass": { "confidence": 98.8995, "value": "None" }, "pose": { "pitch_angle": { "value": -0.000006 }, "roll_angle": { "value": 5.32508 }, "yaw_angle": { "value": -22.432627 } }, "race": { "confidence": 98.62100000000001, "value": "Asian" }, "smiling": { "value": 97.3715 } }, "face_id": "2f60c56506b691c0384e2694fed1c819", "position": { "center": { "x": 51.463415, "y": 25.121951 }, "eye_left": { "x": 46.197561, "y": 20.161 }, "eye_right": { "x": 56.724146, "y": 21.142171 }, "height": 22.926829, "mouth_left": { "x": 45.610732, "y": 30.399024 }, "mouth_right": { "x": 56.01561, "y": 31.734146 }, "nose": { "x": 49.063659, "y": 27.171951 }, "width": 22.926829 }, "tag": "" } ], "img_height": 410, "img_id": "84c20011223acd4efa0b5aa13fc2146d", "img_width": 410, "session_id": "42c5db376fdc4da9855d0135b5e414e2", "url": "http://www.faceplusplus.com.cn/wp-content/themes/faceplusplus/assets/img/demo/16.jpg?v=2" }
#include<iostream> #include<fstream> #include<assert.h> #include "json.h" using namespace std; int main() { Json::Reader reader; Json::Value root; ifstream is; is.open("face.json", ios::binary); if (reader.parse(is, root)) { Json::StyledWriter sw; //縮排輸出 cout << "縮排輸出" << endl; cout << sw.write(root) << endl << endl; } return 0; }
到此這篇關於C++操作.json檔案的文章就介紹到這了,更多相關C++操作.json檔案內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45