精华内容
下载资源
问答
  • c++操作json
    千次阅读
    2021-03-17 10:26:56

    前人栽树,后人乘凉,声明部分引用自:

    1. C++ 之 C++ 操作 json 文件(C++读写json文件)及jsoncpp配置详解
    2. C++构造和解析Json
    3. C++中JSON的使用详解

    一.介绍

    1.什么是Json?

    JSON是一种轻量级的数据交互格式,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率,实际项目中经常用到,相比xml有很多优点。

    2. Json与其他数据存储方式比较

    为什么要用json文件呢?

    我们最常使用的存储数据的方式有很多,比如利用txt文件存,利用xml存,利用word存,利用Excel存,如果我们要求比较高,还可以使用数据库存。

    相对于txt,word来说,json格式更加明确,获取重要信息非常方便。

    相对于xml来说,json格式更加简洁,存储同样的文件,花费的内存更小。

    相对于Excel来说,json更适合存储字符类文件。Excel相当于比较简单的数据库了。

    相对于数据库来说,json更加方便,数据库我们还需要做一些设置,安装一些软件。json可以直接使用。

    3. 内部构成

    jsoncpp 主要包含三个class:Value、Reader、Writer。注意Json::Value 只能处理 ANSI 类型的字符串,如果 C++ 程序是用 Unicode 编码的,最好加一个 Adapt 类来适配。

    value的基本类型有:字符串、数字、true/false、null。

    ------------------------------- Json内部类和方法 --------------------------------

    Reader<是用于读取的,说的确切点,是用于将字符串转换为 Json::Value 对象的>

       【构造函数】
        1、Reader();
       【拷贝构造函数】
        2、Reader( const Features &features );
       【将字符串或者输入流转换为JSON的Value对象】
       【下边是相应的parse的重载函数】
        3、bool parse( const std::string &document, Value &root,bool collectComments = true );
        4、bool parse( const char *beginDoc, const char *endDoc, 
    
                       Value &root,bool collectComments = true         
    
        5、bool parse( std::istream &is,Value &root,bool collectComments = true );
        6、std::string getFormatedErrorMessages() const;
    

    Value:<是jsoncpp 中最基本、最重要的类,用于表示各种类型的对象,jsoncpp 支持的对象类型可见 Json::ValueType 枚举值; Value类的对象代表一个JSON值,既可以代表一个文档,也可以代表 文档中一个值。如同JSON中定义的“值”一样,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;
        【将Value对象进行相应的类型转换】
         5、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 );
        【获取满足相应条件的Value】
         8、Value get( UInt index, const Value &defaultValue ) const;
         Value get( const std::string &key,const Value &defaultValue ) const;
         Members getMemberNames() const;
        【删除满足相应条件的Value】
         9、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;
    

    Writer:<类是一个纯虚类,并不能直接使用。在此我们使用 Json::Writer 的子类(派生类):
    Json::FastWriter、Json::StyledWriter、Json::StyledStreamWriter。顾名思义,用 Json::FastWriter 来处理 json 应该是最快的;负责将内存中的Value对象转换成JSON文档,输出到文件或者是字符串中.

         【FastWriter】
          1、FastWriter();
          virtual ~FastWriter(){}
          void enableYAMLCompatibility();
          virtual std::string write( const Value &root );
         【StyledWriter】
          2、StyledWriter();
          virtual ~StyledWriter(){}
          virtual std::string write( const Value &root );
    

    二. 使用

    1. jsoncpp库配置

    json解析选用jsoncpp作为第三方库,使用广泛,C++一般首选。

    可以自行网上下载源码,生成lib或dll库导入项目使用;
    也可以点击这里下载:jsoncpp.rar
    (解压,里面包含lib库和头文件夹,分别导入你项目的include和lib文件夹下即可)。

    2. C++从字符串读取Json

    首先需要在.cpp文件头部引入

     #include<json.h>
    

    以及配置项里链接器加入:

    jsoncpp.lib     // 名字可能有差异
    

    即可。

    1. 构造json串

    {
    	"Name": "zhangsan",
    	"Info":{
    		"sex": "Man",
    		"age": "25"
    	}
    }
    
    Json::Value JsonRoot;
    string name = "zhangsan";
    JsonRoot["Name"] = name;
    Json:Value tempJson;
    tempJson["sex"] = "Man";
    tempJson["age"] = "25";
    JsonRoot["Info"] = tempJson;
    tempJson.clear();
    Json::FastWriter styleWrite;
    string sRelData = styleWrite.write(JsonRoot);
    JsonRoot.clear();
    

    2. 单层结构json串读取

    设定如下样式:

    {
        "name" : "zhangsan",
        "age" : "25",
        "sex" : "man"
    }
    

    读取代码如下:

    
    void readStrJson()
    {
    	//字符串  
    	const char* str =
    		"{\"name\":\"zhangsan\",\"age\":\"25\",\"sex\":\"man\"}";
     
     
    	Json::Reader reader;
    	Json::Value root;
     
    	//从字符串中读取数据  
    	if (reader.parse(str, root))  // 如果解析成功
    	{
    		string name = root["name"].asString();
    		int age = root["nomen"].asInt();
    		string sex = root["sex"].asString();
    		cout << name + "," << age << "," << sex <<  endl;
    	}
    }
    

    3. 复杂结构json串(多层)读取

    设定如下样式:

    
    {
        "name":"zhangsan",
        "Info":{
            "id":"001",
            "class":"03",
            "teacher":"Qinjiang"
        },
        "Hobby": ["sing","rap","basketball"],
        "Scores":[{
    		"Chinese": "80"
    	},{
    		"Chinese": "90"
    	}]
    }
    

    读取代码如下:

    
    void readStrProJson()
    {
    	string strValue = "{\"name\":\"zhangsan\",\"Info\":{\"id\":\"001\",\"class\":\"03\",\"teacher\":\"Qinjiang\"},\"Hobby\":[\"sing\",\"rap\",\"basketball\"],\"Scores\":[{\"Chinese\":\"80\"}, {\"Chinese\": \"90\"}]}";
    	Json::Reader reader;
    	Json::Value value;
    	if (reader.parse(strValue, value))
    	{
    		// name
    		string name = value["name"].asString();
    		cout << name << endl;
    		// info
    		string id = value["Info"]["id"].asString();
    		cout << id << endl;
    		string sclass = value["Info"]["class"].asString();
    		cout << sclass << endl;
    		string teacher = value["Info"]["teacher"].asString();
    		cout << teacher << endl;
    		// hobby
    		for (unsigned int i = 0; i < value["Hobby"].size(); i++)
    		{
    			string ach = value["Hobby"][i].asString();
    			cout << ach << '\t';
    		}
    		// scores
    		JSON::Value &result = value["Scores"];
    		for (int i=0; i<result.size(); i++)
    		{
    			string score = result[i]["Chinese"].asString();
    			cout << score << endl;
    		}
    	}
    }
    

    假如Scores数组里不止一个{},key值相同时,直接如上遍历输出;如果多个{}且内部key彼此({}和{})不同时可以加if条件输出不同的值。

    4. C++从文件构造/解析json

    以下面为例:

    
    {
       "age" : 21,
       "friends" : {
          "friend_age" : 21,
          "friend_name" : "ZhaoWuxian",
          "friend_sex" : "man"
       },
       "hobby" : [ "sing", "run", "Tai Chi" ],
       "name" : "shuiyixin",
       "sex" : "man"
    }
    

    读取代码如下;

    
    void readFileJson()
    {
    	Json::Reader reader;
    	Json::Value root;
     
    	//从文件中读取,保证当前文件有demo.json文件  
    	ifstream in("demo.json", ios::binary);
     
    	if (!in.is_open())
    	{
    		cout << "Error opening file\n";
    		return;
    	}
     
    	if (reader.parse(in, root))
    	{
    		//读取根节点信息  
    		string name = root["name"].asString();
    		int age = root["age"].asInt();
    		string sex = root["sex"].asString();
     
    		cout << "My name is " << name << endl;
    		cout << "I'm " << age << " years old" << endl;
    		cout << "I'm a " << sex << endl;
     
    		//读取子节点信息  
    		string friend_name = root["friends"]["friend_name"].asString();
    		int friend_age = root["friends"]["friend_age"].asInt();
    		string friend_sex = root["friends"]["friend_sex"].asString();
     
    		cout << "My friend's name is " << friend_name << endl;
    		cout << "My friend's sex is "<<friend_sex << endl;
    		cout << "My friend is " << friend_age << " years old" << endl;
     
    		//读取数组信息  
    		cout << "Here's my hobby:" << endl;
    		for (unsigned int i = 0; i < root["hobby"].size(); i++)
    		{
    			string ach = root["hobby"][i].asString();
    			cout << ach << '\t';
    		}
    		cout << endl;
     
    		cout << "Reading Complete!" << endl;
    	}
    	else
    	{
    		cout << "parse error\n" << endl;
    	}
     
    	in.close();
    }
    

    5. C++写入json文件

    如下:

    
    {
       "age" : 21,
       "friends" : {
          "friend_age" : 21,
          "friend_name" : "ZhaoWuxian",
          "friend_sex" : "man"
       },
       "hobby" : [ "sing", "run", "Tai Chi" ],
       "name" : "shuiyixin",
       "sex" : "man"
    }
    

    写入代码如下:

    
    void writeFileJson()
    {
    	//根节点  
    	Json::Value root;
     
    	//根节点属性  
    	root["name"] = Json::Value("shuiyixin");
    	root["age"] = Json::Value(21);
    	root["sex"] = Json::Value("man");
     
    	//子节点  
    	Json::Value friends;
     
    	//子节点属性  
    	friends["friend_name"] = Json::Value("ZhaoWuxian");
    	friends["friend_age"] = Json::Value(21);
    	friends["friend_sex"] = Json::Value("man");
     
    	//子节点挂到根节点上  
    	root["friends"] = Json::Value(friends);
     
    	//数组形式  
    	root["hobby"].append("sing");
    	root["hobby"].append("run");
    	root["hobby"].append("Tai Chi");
     
    	//直接输出  
    	//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", std::ios::out | std::ios::app);
    	if (!os.is_open())
    		cout << "error:can not find or create the file which named \" demo.json\"." << endl;
    	os << sw.write(root);
    	os.close();
     
    }
    
    更多相关内容
  • 在Windows和Linux下用C++操作JSON的类库.zip
  • 二、C++操作json文件 1、jsoncpp 库下载 2、C++从字符串中读取json 3、C++从文件中读取json 4、C++写入json文件 5、主函数 附:jsoncpp库配置 1、解压并转移 2、配置属性 3、配置项目 前言 json文件是...

    目录

    前言

    一、json文件简介

    1、json文件

    2、json与其他存储数据方式比较

    二、C++操作json文件

    1、jsoncpp 库下载

    2、C++从字符串中读取json

    3、C++从文件中读取json

    4、C++写入json文件

    5、主函数

     附:jsoncpp库配置

    1、解压并转移

    2、配置属性

    3、配置项目


    前言

    json文件是比较轻量级的文件,格式简单,使用方便。用来存放信息相比其他方式有自己得天独厚的优势。

    今天给大家分享的是如何利用C++来操作json文件。

    如果你知道如何使用jsoncpp类库,可以不用看附,如果第一次使用,请先到最后,将环境配置好,再进行操作。

    一、json文件简介

    1、json文件

    JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

    2、json与其他存储数据方式比较

    为什么要用json文件呢?

    我们最常使用的存储数据的方式有很多,比如利用txt文件存,利用xml存,利用word存,利用Excel存,如果我们要求比较高,还可以使用数据库存。

    相对于txt,word来说,json格式更加明确,获取重要信息非常方便。

    相对于xml来说,json格式更加简洁,存储同样的文件,花费的内存更小。

    相对于Excel来说,json更适合存储字符类文件。Excel相当于比较简单的数据库了。

    相对于数据库来说,json更加方便,数据库我们还需要做一些设置,安装一些软件。json可以直接使用。

    二、C++操作json文件

    1、jsoncpp 库下载

    大家可以自己上网下载jsoncpp 库,也可以加群:326866692下载;

    群二维码

    2、C++从字符串中读取json

    json样式比较多,这里分享两种,一种比较直接简单的,一种稍微有些复杂的。

    1.简单json样式

    我们定义一个字符串来保存如下json数据:

     
    1. {

    2. "name" : "shuiyixin",

    3. "age" : "21",

    4. "sex" : "man"

    5. }

    读取代码如下:

     
    1. void readStrJson()

    2. {

    3. //字符串

    4. const char* str =

    5. "{\"name\":\"shuiyixin\",\"age\":\"21\",\"sex\":\"man\"}";

    6.  
    7.  
    8. Json::Reader reader;

    9. Json::Value root;

    10.  
    11. //从字符串中读取数据

    12. if (reader.parse(str, root))

    13. {

    14. string name = root["name"].asString();

    15. int age = root["nomen"].asInt();

    16. string sex = root["sex"].asString();

    17. cout << name + "," << age << "," << sex << endl;

    18. }

    19.  
    20. }

    2.复杂json样式

    所谓复杂,就是说,json里面分好几层,上面那个简单的只有一层,json数据如下:

     
    1. {

    2. "name":"shuiyixin",

    3. "major":[

    4. {

    5. "AI":"MachineLearning"

    6. },

    7. {

    8. "AI":"DeepLearning"

    9. },

    10. {

    11. "AI":"ComputerVision"

    12. }]

    13. }

    读取代码如下:

     
    1. void readStrProJson()

    2. {

    3. string strValue = "{\"name\":\"shuiyixin\",\"major\":[{\"AI\":\"MachineLearning\"},{\"AI\":\"DeepLearning\"},{\"AI\":\"ComputerVision\"}]}";

    4. Json::Reader reader;

    5. Json::Value value;

    6. if (reader.parse(strValue, value))

    7. {

    8. string out = value["name"].asString();

    9. cout << out << endl;

    10. const Json::Value arrayObj = value["major"];

    11. for (unsigned int i = 0; i < arrayObj.size(); i++)

    12. {

    13. out = arrayObj[i]["AI"].asString();

    14. cout << out<<endl;

    15. }

    16. }

    17. }

     

    3、C++从文件中读取json

    从字符串中读取json文件只是为了让大家能够了解json文件,我们最终还是要从文件中读取的。

    这个读取的json文件,大家可以通过下面的写json文件自己创建一个。

    以下面这个json文件为例:

     
    1. {

    2. "age" : 21,

    3. "friends" : {

    4. "friend_age" : 21,

    5. "friend_name" : "ZhaoWuxian",

    6. "friend_sex" : "man"

    7. },

    8. "hobby" : [ "sing", "run", "Tai Chi" ],

    9. "name" : "shuiyixin",

    10. "sex" : "man"

    11. }

    读取代码如下:

     
    1. void readFileJson()

    2. {

    3. Json::Reader reader;

    4. Json::Value root;

    5.  
    6. //从文件中读取,保证当前文件有demo.json文件

    7. ifstream in("demo.json", ios::binary);

    8.  
    9. if (!in.is_open())

    10. {

    11. cout << "Error opening file\n";

    12. return;

    13. }

    14.  
    15. if (reader.parse(in, root))

    16. {

    17. //读取根节点信息

    18. string name = root["name"].asString();

    19. int age = root["age"].asInt();

    20. string sex = root["sex"].asString();

    21.  
    22. cout << "My name is " << name << endl;

    23. cout << "I'm " << age << " years old" << endl;

    24. cout << "I'm a " << sex << endl;

    25.  
    26. //读取子节点信息

    27. string friend_name = root["friends"]["friend_name"].asString();

    28. int friend_age = root["friends"]["friend_age"].asInt();

    29. string friend_sex = root["friends"]["friend_sex"].asString();

    30.  
    31. cout << "My friend's name is " << friend_name << endl;

    32. cout << "My friend's sex is "<<friend_sex << endl;

    33. cout << "My friend is " << friend_age << " years old" << endl;

    34.  
    35. //读取数组信息

    36. cout << "Here's my hobby:" << endl;

    37. for (unsigned int i = 0; i < root["hobby"].size(); i++)

    38. {

    39. string ach = root["hobby"][i].asString();

    40. cout << ach << '\t';

    41. }

    42. cout << endl;

    43.  
    44. cout << "Reading Complete!" << endl;

    45. }

    46. else

    47. {

    48. cout << "parse error\n" << endl;

    49. }

    50.  
    51. in.close();

    52. }

    4、C++写入json文件

    除了读,我们经常还会写入json文件,json文件如下:

     
    1. {

    2. "age" : 21,

    3. "friends" : {

    4. "friend_age" : 21,

    5. "friend_name" : "ZhaoWuxian",

    6. "friend_sex" : "man"

    7. },

    8. "hobby" : [ "sing", "run", "Tai Chi" ],

    9. "name" : "shuiyixin",

    10. "sex" : "man"

    11. }

    写入代码如下:

     
    1. void writeFileJson()

    2. {

    3. //根节点

    4. Json::Value root;

    5.  
    6. //根节点属性

    7. root["name"] = Json::Value("shuiyixin");

    8. root["age"] = Json::Value(21);

    9. root["sex"] = Json::Value("man");

    10.  
    11. //子节点

    12. Json::Value friends;

    13.  
    14. //子节点属性

    15. friends["friend_name"] = Json::Value("ZhaoWuxian");

    16. friends["friend_age"] = Json::Value(21);

    17. friends["friend_sex"] = Json::Value("man");

    18.  
    19. //子节点挂到根节点上

    20. root["friends"] = Json::Value(friends);

    21.  
    22. //数组形式

    23. root["hobby"].append("sing");

    24. root["hobby"].append("run");

    25. root["hobby"].append("Tai Chi");

    26.  
    27. //直接输出

    28. //cout << "FastWriter:" << endl;

    29. //Json::FastWriter fw;

    30. //cout << fw.write(root) << endl << endl;

    31.  
    32. //缩进输出

    33. cout << "StyledWriter:" << endl;

    34. Json::StyledWriter sw;

    35. cout << sw.write(root) << endl << endl;

    36.  
    37. //输出到文件

    38. ofstream os;

    39. os.open("demo.json", std::ios::out | std::ios::app);

    40. if (!os.is_open())

    41. cout << "error:can not find or create the file which named \" demo.json\"." << endl;

    42. os << sw.write(root);

    43. os.close();

    44.  
    45. }

    要注意的是:

    1.如果要写入的文件不存在,会自动创建该文件;

    2.如果文件存在,写入过程不会覆盖文件中原有数据,而是将新数据写在原有数据后面。

    5、主函数

    所有的功能模块都写好啦,剩下就是主函数啦:

     
    1. #include <string>

    2. #include <json.h>

    3. #include <iostream>

    4. #include <fstream>

    5. using namespace std;

    6.  
    7. void readStrJson(); //从字符串中读取JSON

    8. void readStrProJson(); //从字符串中读取JSON(内容复杂些)

    9. void readFileJson(); //从文件中读取JSON

    10. void writeFileJson(); //将信息保存为JSON格式

    11.  
    12. int main(int argc, char *argv[])

    13. {

    14. writeFileJson(); //写入json

    15.  
    16. readFileJson(); //从文件中读取JSON

    17.  
    18. cout << "\n\n";

    19.  
    20. readStrJson(); //从字符串中读json

    21.  
    22. cout << "\n\n";

    23.  
    24. readStrProJson();//从字符串中读取JSON(内容复杂些)

    25.  
    26. system("pause");

    27. return 0;

    28. }

     附:jsoncpp库配置

    jsoncpp库配置与opencv配置原理相同,大家可以看一下下面的教程:

    opencv配置(win10+VS2015+OpenCV3.1.0) :https://blog.csdn.net/shuiyixin/article/details/80386022

    不过jsoncpp库的内容比较少,配置没有opencv那么麻烦:

    1、解压并转移

    首先将库解压,将下面的两个文件夹复制到你创建的项目下面

    将库解压

    将两个文件夹复制到自己创建的项目中

    2、配置属性

    点击调试,并点击项目属性

    点击调试->项目属性

    选择VC++目录中的包含目录,点击修改

    将includ文件夹下的json文件路径复制到这里,并保存

    3、配置项目

    将src文件夹下的lib_json文件夹下的cpp文件,添加到源文件中:

    找到src文件夹->lib_json文件夹->所有cpp文件,并复制

     

    添加到源文件中

    然后就可以使用啦。

    展开全文
  • C++操作JSON[参考].pdf

    2021-10-11 01:02:06
    C++操作JSON[参考].pdf
  • C++操作.json文件

    千次阅读 2022-05-02 22:11:13
    JavaScript、PHP、Java、Python、C++等编程语言都内置了处理JSON数据的方法。 JSON 是基于 JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集,是一种开放的、轻量级的数据交换格式,采用独立...

    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文件的操作

    2017-08-01 18:20:13
    将压缩文件解压至工程目录下 在项目中增加#include"json/json.h" 即可使用
  • 主要介绍了C++解析Json的方法,结合实例形式分析了C++操作json格式数据的相关实现技巧与注意事项,需要的朋友可以参考下
  • jsoncpp是一个c++封装的json包,跨平台支持windows、linux、unix等多系统 jsoncpp源码地址:https://github.com/open-source-parsers/jsoncpp 库的安装 sudo apt-get install libjsoncpp-dev 安装完成之后,...

    一、jsoncpp库概述

    库的安装

    sudo apt-get install libjsoncpp-dev

    • 安装完成之后,头文件默认安装在/usr/include/jsoncpp/json/目录下,库API文档默认在/usr/share/doc/libjsoncpp-dev/目录下

    编译带有jsoncpp库的C++程序

    • 使用如下的命令进行编译,编译时带上-ljsoncpp选项即可
    • 例如:
    g++ jsoncpp_demo01.c -o demo01 -ljsoncpp -std=c++11

    二、jsoncpp支持的值

    • jsoncpp 使用 Json::Value 对象来保存 JSON 串,Json::Value 对象可以表示如下数据类 型:

    三、相关接口

    检测保存的数据类型

    bool isNull() const;
    bool isBool() const;
    bool isInt() const;
    bool isInt64() const;
    bool isUInt() const;
    bool isUInt64() const;
    bool isIntegral() const;
    bool isDouble() const;
    bool isNumeric() const;
    bool isString() const;
    bool isArray() const;
    bool isObject() const;

    基础数据类型的访问

    const char* asCString() const;
    JSONCPP_STRING asString() const;
    Int asInt() const;
    UInt asUInt() const;
    Int64 asInt64() const;
    UInt64 asUInt64() const;
    LargestInt asLargestInt() const;
    LargestUInt asLargestUInt() const;
    float asFloat() const;
    double asDouble() const;
    bool asBool() const;

    数组风格

    • ValueType::arrayValue 和 ValueType::objectValue 数据类型的访问,操作方式很类似 C++的 vector,可以使用数组风格或者迭代器风格来操作数据。例如:
    root["name"] = "milo";
    • 下面是相关接口
    ArrayIndex size() const;
    Value& operator[](ArrayIndex index);
    Value& operator[](int index);
    const Value& operator[](ArrayIndex index) const;
    const Value& operator[](int index) const;
    Value get(ArrayIndex index, const Value& defaultValue) const;
    const_iterator begin() const;
    const_iterator end() const;
    iterator begin();
    iterator end();
    • ValueType::objectValue 数据类型的访问,操作方式很类似 C++的 map
    Value& operator[](const char* key);
    const Value& operator[](const char* key) const;
    Value& operator[](const JSONCPP_STRING& key);
    const Value& operator[](const JSONCPP_STRING& key) const;
    Value& operator[](const StaticString& key);
    Value& operator[](const CppTL::ConstString& key);
    const Value& operator[](const CppTL::ConstString& key) const;
    Value get(const char* key, const Value& defaultValue) const;
    Value get(const char* begin, const char* end, const Value& defaultValue) const;
    Value get(const JSONCPP_STRING& key, const Value& defaultValue) const;
    Value get(const CppTL::ConstString& key, const Value& defaultValue) const;

    修改数据

    • 知道如何获取 Json::Value 对象或其子对象后,我们来看下如何修改 Json::Value 保存 的数据:
    • 直接使用=赋值就可以了
    Value& operator=(Value other);
    • 因为 Json::Value 已经实现了各种数据类型的构造函数
    Value(ValueType type = nullValue);
    Value(Int value);
    Value(UInt value);
    Value(Int64 value);
    Value(UInt64 value);
    Value(double value);
    Value(const char* value);
    Value(const char* begin, const char* end);
    Value(const StaticString& value);
    Value(const JSONCPP_STRING& value);
    Value(const CppTL::ConstString& value);
    Value(bool value);
    Value(const Value& other);
    Value(Value&& other);

    四、注意事项

    类型转换

    • 对于Int、Uint、Int64、UInt64等类型,注意类型。
    root["age"] = 80;  //默认为Int类型
    • 可以使用下面的方式进行强制类型转换
    root["age"] = (Json::Uint)80;

    空值

    • 如果要将变量设置为 null,应该使用如下的方式
    root["address"] = Json::nullValue;

    五、演示案例1

    代码如下

    #include <iostream>
    #include <string>
    #include <jsoncpp/json/json.h>
    
    int main()
    {
        std::cout << "Hello World!" << std::endl;
    
        Json::Value root;
        Json::FastWriter fast;
    
        root["ModuleType"] = Json::Value(1);
        root["ModuleCode"] = Json::Value("China");
    
        std::cout<<fast.write(root)<<std::endl;
    
        Json::Value sub;
        sub["version"] = Json::Value("1.0");
        sub["city"] = Json::Value(root);
        fast.write(sub);
    
        std::cout<<sub.toStyledString()<<std::endl;
    
        return 0;
    }
    • 编译运行如下: 
    g++ jsoncpp_demo01.c -o demo01 -ljsoncpp -std=c++11

    六、演示案例2

    代码如下

    #include <string>
    #include <jsoncpp/json/json.h>
    #include <iostream>
     
    using namespace std;
     
    void readJson() {
    	std::string strValue = "{\"name\":\"json\",\"array\":[{\"cpp\":\"jsoncpp\"},{\"java\":\"jsoninjava\"},{\"php\":\"support\"}]}";
     
    	Json::Reader reader;
    	Json::Value value;
     
    	if (reader.parse(strValue, value))
    	{
    		std::string out = value["name"].asString();
    		std::cout << out << std::endl;
    		const Json::Value arrayObj = value["array"];
    		for (unsigned int i = 0; i < arrayObj.size(); i++)
    		{
    			if (!arrayObj[i].isMember("cpp")) 
    				continue;
    			out = arrayObj[i]["cpp"].asString();
    			std::cout << out;
    			if (i != (arrayObj.size() - 1))
    				std::cout << std::endl;
    		}
    	}
    }
    
    void writeJson() {
     
    	Json::Value root;
    	Json::Value arrayObj;
    	Json::Value item;
     
    	item["cpp"] = "jsoncpp";
    	item["java"] = "jsoninjava";
    	item["php"] = "support";
    	arrayObj.append(item);
     
    	root["name"] = "json";
    	root["array"] = arrayObj;
     
    	root.toStyledString();
    	std::string out = root.toStyledString();
    	std::cout << out << std::endl;
    }
    
    int main(int argc, char** argv) {
    	readJson();
    	writeJson();
    	return 0;
    }
    • 编译运行如下:  
    g++ jsoncpp_demo02.c -o demo02 -ljsoncpp -std=c++11

    七、演示案例3

    代码如下

    //测试jsoncpp的使用方法和性能
    #include <memory>
    #include <sstream>
    #include <iostream>
    #include <stdint.h>
    #include <unistd.h>
    #include <sys/time.h>
    #include <sys/wait.h>
    #include "jsoncpp/json/json.h"
    #include "jsoncpp/json/value.h"
    #include "jsoncpp/json/reader.h"
    #include "jsoncpp/json/writer.h"
    
    /*
    
    {
      "name": "milo",
      "age": 80,
      "languages": ["C++", "C"],
      "phone": {
        "number": "186****3143",
        "type": "home"
      },
      "books":[
          {
              "name": "Linux kernel development",
              "price":7.7
          },
          {
              "name": "Linux server development",
              "price": 8.0
          }
      ],
      "vip":true,
      "address": null
    }
     */
    
    static uint64_t getNowTime()
    {
        struct timeval tval;
        uint64_t nowTime;
    
        gettimeofday(&tval, NULL);
    
        nowTime = tval.tv_sec * 1000L + tval.tv_usec / 1000L;
        return nowTime;
    }
    
    std::string JsoncppEncodeNew()
    {
        std::string jsonStr;
        // 一个value是可以包含多个键值对
        Json::Value root, languages, phone, book, books;
    
        // 姓名
        root["name"] = "milo";
        // 年龄
        root["age"] = 80;
    
        // 语言
        languages[0] = "C++";
        languages[1] = "Java";
        root["languages"] = languages;
    
        // 电话
        phone["number"] = "186****3143";
        phone["type"] = "home";
        root["phone"] = phone;
    
        // 书籍
        book["name"] = "Linux kernel development";
        book["price"] = 7.7;
        books[0] = book;    // 深拷贝
        book["name"] = "Linux server development";
        book["price"] = 8.0;
        books[1] = book;    // 深拷贝
        root["books"] = books;
    
        // 是否为vip
        root["vip"] = true;
    
        // address信息空null
        root["address"] = "yageguoji";
    
        Json::StreamWriterBuilder writerBuilder;
        std::ostringstream os;
        std::unique_ptr<Json::StreamWriter> jsonWriter(writerBuilder.newStreamWriter());
        jsonWriter->write(root, &os);
        jsonStr = os.str();
    
        // std::cout << "Json:\n" << jsonStr << std::endl;
        return jsonStr;
    }
    
    std::string JsoncppEncodeOld()
    {
        std::string jsonStr;
        Json::Value root, languages, phone, book, books;
    
        // 姓名
         root["name"] = "milo";
        //root["name"] = Json::nullValue;
        // 年龄
        root["age"] =  80; 
    
        // 语言
        languages[0] = "C++";
        languages[1] = "Java";
        root["languages"] = languages;
    
        // 电话
        phone["number"] = "186****3143";
        phone["type"] = "home";
        root["phone"] = phone;
    
        // 书籍
        book["name"] = "Linux kernel development";
        book["price"] = (float)7.7;
        books[0] = book;
        book["name"] = "Linux server development";
        book["price"] = (float)8.0;
        books[1] = book;
        root["books"] = books;
    
        // 是否为vip
        root["vip"] = true;
    
        // address信息空null
        root["address"] = "yageguoji"; //;// Json::nullValue; // 如果是null,则要用自定义的Json::nullValue,不能用NULL
    
        Json::FastWriter writer;
        jsonStr = writer.write(root);
    
        // std::cout << "Json:\n" << jsonStr << std::endl;
        return jsonStr;
    }
    
    // 不能返回引用
    Json::Value JsoncppEncodeOldGet()
    {
        Json::Value root;
        Json::Value languages, phone, book, books;
    
        // 姓名
        root["name"] = "milo";
        //root["name"] = Json::nullValue;
        // 年龄
        root["age"] =  80; 
    
        // 语言
        languages[0] = "C++";
        languages[1] = "Java";
        root["languages"] = languages;
    
        // 电话
        phone["number"] = "186****3143";
        phone["type"] = "home";
        root["phone"] = phone;
    
        // 书籍
        book["name"] = "Linux kernel development";
        book["price"] = (float)7.7;
        books[0] = book;
        book["name"] = "Linux server development";
        book["price"] = (float)8.0;
        books[1] = book;
        root["books"] = books;
    
        // 是否为vip
        root["vip"] = true;
    
        // address信息空null
        root["address"] = Json::nullValue; //"yageguoji";// Json::nullValue; // 如果是null,则要用自定义的Json::nullValue,不能用NULL
    
     
    
        std::cout << "JsoncppEncodeOldGet:\n"  << std::endl;
        return root;
    }
    
    void printJsoncpp(Json::Value &root)
    {
        if(root["name"].isNull())
        {
            std::cout << "name null\n";
        }
        std::cout << "name: " << root["name"].asString() << std::endl;
        std::cout << "age: " << root["age"].asInt() << std::endl;
    
        Json::Value &languages = root["languages"];
        std::cout << "languages: ";
        for (uint32_t i = 0; i < languages.size(); ++i)
        {
            if (i != 0)
            {
                std::cout << ", ";
            }
            std::cout << languages[i].asString();
        }
        std::cout << std::endl;
    
        Json::Value &phone = root["phone"];
        std::cout << "phone number: " << phone["number"].asString() << ", type: " << phone["type"].asString() << std::endl;
    
        Json::Value &books = root["books"];
        for (uint32_t i = 0; i < books.size(); ++i)
        {
            Json::Value &book = books[i];
            std::cout << "book name: " << book["name"].asString() << ", price: " << book["price"].asFloat() << std::endl;
        }
        std::cout << "vip: " << root["vip"].asBool() << std::endl;
    
        if (!root["address"].isNull())
        {
            std::cout << "address: " << root["address"].asString() << std::endl;
        }
        else
        {
            std::cout << "address is null" << std::endl;
        }
    }
    
    bool JsoncppDecodeNew(const std::string &info)
    {
        if (info.empty())
            return false;
    
        bool res;
        JSONCPP_STRING errs;
        Json::Value root;
        Json::CharReaderBuilder readerBuilder;
        std::unique_ptr<Json::CharReader> const jsonReader(readerBuilder.newCharReader());
        res = jsonReader->parse(info.c_str(), info.c_str() + info.length(), &root, &errs);
        if (!res || !errs.empty())
        {
            std::cout << "parseJson err. " << errs << std::endl;
            return false;
        }
        // printJsoncpp(root);
    
        return true;
    }
    
    bool JsoncppDecodeOld(const std::string &strJson)
    {
        if (strJson.empty())
            return false;
    
        bool res;
    
        Json::Value root;
        Json::Reader jsonReader;
    
        res = jsonReader.parse(strJson, root);
        if (!res)
        {
            std::cout << "jsonReader.parse err. " << std::endl;
            return false;
        }
    
        // printJsoncpp(root);
    
        return true;
    }
    
    const char *strCjson = "{                 \
    	\"name\":	\"milo\",         \
    	\"age\":	80,                 \
    	\"languages\":	[\"C++\", \"C\"],\
    	\"phone\":	{                       \
    		\"number\":	\"186****3143\",    \
    		\"type\":	\"home\"            \
    	},                                  \
    	\"books\":	[{                         \
    			\"name\":	\"Linux kernel development\",   \
    			\"price\":	7.700000        \
    		}, {                            \
    			\"name\":	\"Linux server development\",   \
    			\"price\":	8               \
    		}],                             \
    	\"vip\":	true,                   \
    	\"address\":	null                \
    }                                      \
    ";
    #define TEST_COUNT 100000
    int main()
    {
        std::string jsonStrNew;
        std::string jsonStrOld;
    
        jsonStrNew = JsoncppEncodeNew();
        // JsoncppEncodeNew size: 337
        std::cout << "JsoncppEncodeNew size: " << jsonStrNew.size() << std::endl;
        std::cout << "JsoncppEncodeNew string: " << jsonStrNew << std::endl;
        JsoncppDecodeNew(jsonStrNew);
    
        jsonStrOld = JsoncppEncodeOld();
        // JsoncppEncodeOld size: 248
        std::cout << "\n\nJsoncppEncodeOld size: " << jsonStrOld.size() << std::endl;
        std::cout << "JsoncppEncodeOld string: " << jsonStrOld << std::endl;
        JsoncppDecodeOld(jsonStrOld);
    
        Json::Value root = JsoncppEncodeOldGet();
        Json::FastWriter writer;
        std::cout << "writer:\n"  << std::endl;
        std::string jsonStr = writer.write(root);
        std::cout << "\n\njsonStr string: " << jsonStrOld << std::endl;
    #if 1
        uint64_t startTime;
        uint64_t nowTime;
        
        startTime = getNowTime();
        std::cout << "jsoncpp encode time testing" << std::endl;
        for(int i = 0; i < TEST_COUNT; i++)
        {
            JsoncppEncodeNew();
        }
        nowTime = getNowTime();
        std::cout << "jsoncpp encode " << TEST_COUNT << " time, need time: "
             << nowTime-startTime << "ms"  << std::endl;
    
        startTime = getNowTime();
        std::cout << "\njsoncpp encode time testing" << std::endl;
        for(int i = 0; i < TEST_COUNT; i++)
        {
            JsoncppEncodeOld();
        }
        nowTime = getNowTime();
        std::cout << "jsoncpp encode " << TEST_COUNT << " time, need time: "
             << nowTime-startTime << "ms"  << std::endl;
    
        startTime = getNowTime();
        std::cout << "\njsoncpp decode time testing" << std::endl;
        for(int i = 0; i < TEST_COUNT; i++)
        {
            JsoncppDecodeNew(jsonStrNew);
        }
        nowTime = getNowTime();
        std::cout << "jsoncpp decode " << TEST_COUNT << " time, need time: "
             << nowTime-startTime << "ms"  << std::endl;
    
        startTime = getNowTime();
        std::cout << "\njsoncpp decode time testing" << std::endl;
        for(int i = 0; i < TEST_COUNT; i++)
        {
            JsoncppDecodeOld(jsonStrNew);
        }
        nowTime = getNowTime();
        std::cout << "jsoncpp decode " << TEST_COUNT << " time, need time: "
             << nowTime-startTime << "ms"  << std::endl;
    #endif
    
        return 0;
    }
    
    • 编译运行如下:  
    g++ jsoncpp_speed.cpp -o jsoncpp_speed -ljsoncpp -std=c++11

     

    展开全文
  • c++json读取操作

    2022-05-19 16:18:18
    后续操作也都是基于该开源库操作。 本地json文件如下: {"model_config":{ "model_type":"paddlex", "model_cfg_file":"./models/yolov3/model.yml", "model_key":"", "model_filename":"./models/yolov3/...
  • 主要介绍了C++使用JsonCpp库操作json格式数据,结合实例形式详细分析了JsonCpp库的下载及C++使用JsonCpp库对json格式数据序列化相关操作技巧,需要的朋友可以参考下
  • RedisJSON RedisJSON是一个Redis...主要功能:全面支持JSON标准JSONPath语法,用于选择文档中的元素文档以二进制数据存储在树结构中,从而允许快速访问所有JSON值类型的子元素键入的原子操作基于RediSear的二级索引支持
  • 最近在code时需要对json数据进行解析和封装,借此对有关json数据的格式、解析操作等知识进行归纳整理。 json数据 json 全称是 “JavaScript Object Notation”,意为JavaScript的对象表示法。json是js的原生内容,...
  • C++使用Json

    2016-07-21 10:14:44
    C++使用json库 rapidjson JsonCpp ggicci--json nlohmann
  • C++读取Json数据

    2021-04-02 15:41:03
    最近C++和Python接口进行交互时,部分接口返回回来的数据为Json数据,需要一个类似于解析Json数据的接口,将数据类似于字典化,便于读取,网上有相应的读取文件接口,本文只是做一个常用操作的简单描述,具体接口还...
  • 这是C ++的JSON,这是一个与其他许多功能强大的JSON库不同的JSON库。 尽管可能有数十个JSON库,但C ++的JSON突出表现在三件事上:直观的语法... 它的许多功能包括JSON指针,JSON补丁,迭代器,SAX解析和各种容器操作
  • C++解析json数据

    千次阅读 2021-08-23 14:11:55
    Json::Value fcgiRetData; ...//获取到fcgiRetData数据 Json::StyledWriter styledWriter;...转载:C++解析JSON格式数据 1:封装JSON数据为string std::string DataToJson() { Json::FastWriter writerinfo; J
  • C++操作Json字符串

    万次阅读 2014-11-10 21:08:58
    一、从字符串中读取JSON a.cpp ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...
  • 目录 实验所需要的库 C++标准库是不支持对json文件的操作,所以需要下载第三方库,本次实验使用的是一个比较轻量级的json库CJsonObject,地址:https://github.com/Bwar/CJsonObject
  • 是一个多功能集合库,其中有 JSON5 解析器。支持注释 链接: https://github.com/zpl-c/zpl# HJSON HJSON支持注释,支持多种语言。 链接:https://github.com/hjson/ cJSON 用c写的超轻量级JSON解析器。只有一个.h...
  • 这是用于 C++JSON,这是一个 JSON 库,与其他任何库都不同,它具有许多强大的功能。 尽管可能有数十个JSON库,但C ++的JSON突出表现... 它的众多功能包括 JSON 指针、JSON 补丁、迭代器、SAX 解析和各种容器操作
  • C++ JSON读写

    2018-08-08 12:10:42
    经常会遇到需要将数据保存成JSON格式或者需要从已有的JSON格式中读取信息的情况,首先需要添加一个自定义的JSON库,然后用相应的函数进行操作
  • jsoncpp-master_C++_JSON_

    2021-09-29 15:00:09
    JSONCPP是一个C++库,允许操作JSON值,包括字符串的序列化和反序列化。它还可以在非序列化/序列化步骤中保留现有注释,使其成为存储用户输入文件的方便格式。
  • 【Qt】【C++JSON 使用

    2020-12-09 10:01:34
    通过Qt操作JSON 数据,实现对JSON数据的解析 修改 添加。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。键值对的无序集合——对象。值的有序列表——数组。
  • c++读写JSON数据

    2020-09-12 12:00:11
    文章目录JSON安装下载jsoncpp到linux生成静态库libjsoncpp.a拷贝头文件与静态库到/usr/local下JSON用法简介json简介valuewriterreader测试程序 JSON安装 JSON(JavaScript Object Notation)跟xml一样也是一种数据交换...
  • Linux 下 json库的安装及使用 C++json使用 1.官网下载json-cpp,可以去sourceforge或github https://sourceforge.net/projects/jsoncpp/files/ 这里下载的是jsoncpp-src-0.5.0.tar.gz 2.下载scons ...
  • c++ json读写文件,可扩展接口 使用只需要引用头文件即可,泛型接口,操作简单,可用于配置文件读写
  • C++中使用json

    千次阅读 2021-04-07 11:21:30
    关于json的语法,可以查阅我的另一篇博客json介绍及使用QJson操作json格式数据,这里面对于json的语法以及Qt对于json格式数据的操作进行了比较详细的介绍。 rapidjson仅仅是生成/解析json格式的数据,并不涉及到具体...
  • c++JSON操作

    2019-12-23 11:20:07
      说到http协议那就离不开json数据的解析了,那么在C++中如何对json数据进行解析呢?博主在这里使用jsoncpp来解析json数据。   jsoncpp 主要包含三种类型的 class:Value、Reader、Writer。jsoncpp 中所有对象...
  • C++Json解析库:jsoncpp

    千次阅读 2021-08-12 15:39:17
    json官网上列出了各种语言对应的json解析库,作者仅介绍自己使用过的两种C++json解析库:jsoncpp(v0.5.0)和Boost(v1.34.0)。 一. 使用jsoncpp解析json Jsoncpp是个跨平台的开源库,首先从http://jsoncpp.sourc.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,971
精华内容 23,588
关键字:

c++操作json

c++ 订阅