首頁 > 軟體

C++操作.json檔案的超詳細新手教學

2022-08-11 22:00:14

1.JSON簡介

1.1 什麼是JSON:

JSON是一種純字串形式的資料,它本身不提供任何方法(函數),非常適合在網路中進行傳輸。JavaScript、PHP、Java、Python、C++等程式語言都內建了處理JSON資料的方法。

JSON 是基於 JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一個子集,是一種開放的、輕量級的資料交換格式,採用獨立於程式語言的文字格式來儲存和表示資料,易於程式設計師閱讀與編寫,同時也易於計算機解析和生成,通常用於在 Web 使用者端(瀏覽器)與 Web 伺服器端之間傳遞資料。

在JSON中,使用一下兩種方式表示資料:

  • object(物件):鍵/值對(名稱/值)的集合,使用花括號{}定義。在每個鍵/值對中,以鍵開頭,後跟一個冒號,最後是值。多個鍵/值對之間使用逗號分隔,例如"name":"FilterWindow","paramtype":"0"
  • Array(陣列):值的有序集合,使用方括號[]定義,陣列中每個值之間使用逗號進行分隔。

下面展示一個簡單的JSON資料:

{
	"name" : "FilterWindow",
	"paramtype" : "0",
	"range" : 
	{
		"max" : 99,
		"min" : 3
	},
	"required" : true,
	"title" : "濾波視窗大小",
	"type" : "int",
	"value" : 51
	"tempValue" : 
	[
		"不生成" : 1,
		"生成" : 0
	],
}

1.2 JSON的優缺點:

優點:

  相對於txt,word來說,json格式更加明確,獲取重要資訊非常方便。

  相對於xml來說,json格式更加簡潔,儲存同樣的檔案,花費的記憶體更小。

  相對於Excel來說,json更適合儲存字元類檔案。Excel相當於比較簡單的資料庫了。

  相對於資料庫來說,json更加方便,資料庫我們還需要做一些設定,安裝一些軟體。json可以直接使用。
 

缺點:

  只有一種數位型別:JSON中只能支援IEEE-754雙精度浮點格式,因此我們無法使用JSON來儲存許多程式語言中多樣化的數位型別;

  沒有日期型別:在JSON中我們只能通過日期的字串(例如:1970-01-01)或者時間戳(例如:1632366361)來表示日期;

  沒有註釋:在JSON中無法新增註釋;

  冗長:雖然JSON比XML更加簡潔,但它不是最簡潔的資料交換格式,對於資料量龐大或用途特殊的服務,我們需要更加高效的資料格式。

1.3 JSON的儲存:

JSON資料可以儲存在.json格式的檔案中(與.txt格式類似,都屬於純文字檔案),也可以將JSON資料以字串的形式儲存在資料庫、Cookie、Session中。要使用儲存好的JSON資料也非常簡單,不同的程式語言中提供了不同的方法來檢索和解析JSON資料,今天我們的重點就是使用C++來操作.json檔案。而C++主要使用jsoncpp這個跨平臺的開源庫來實現對.json檔案的各類操作。

2.jsoncpp庫介紹

2.1 jsoncpp庫的設定使用:

這裡我就不按照網上常規的方式來介紹了,常規的方法無非是關於下載jsoncpp庫,然後使用Windows編譯(vs2015),最後整理出include及lib來使用jsoncpp庫。我這裡是整理好的,是直接把include裡的所有檔案集合成json.h以及json.cpp。用的時候直接把這些檔案包含進自己的專案一起編譯即可。

2.2 jsoncpp庫內部構成:

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 );

3.json檔案讀取(例)

3.1 json檔案:

{
  "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"
}

3.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;
}

3.3 結果圖:

總結 

到此這篇關於C++操作.json檔案的文章就介紹到這了,更多相關C++操作.json檔案內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com