GVKun编程网logo

jsonCpp使用介绍和优化(jsoncpp用法)

9

本篇文章给大家谈谈jsonCpp使用介绍和优化,以及jsoncpp用法的知识点,同时本文还将给你拓展C++qt使用jsoncppjson读写操作、C++使用JsonCpp库操作json格式数据示例、C

本篇文章给大家谈谈jsonCpp使用介绍和优化,以及jsoncpp用法的知识点,同时本文还将给你拓展C++ qt 使用jsoncpp json 读写操作、C++使用JsonCpp库操作json格式数据示例、C++通过jsoncpp类库读写JSON文件-json用法详解、Centos下 jsoncpp使用详解等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

jsonCpp使用介绍和优化(jsoncpp用法)

jsonCpp使用介绍和优化(jsoncpp用法)



JsonCpp简介

  • JsonCpp主要包含三种类型的class:Value Reader Writer。
  • jsoncpp中所有对象、类名都在namespace json中,包含json.h即可。

注意: Json::Value只能处理ANSI类型的字符串,如果C++程序使用Unicode编码的,最好加一个Adapt类来适配。


简单解析例子:

数据格式为:

{
      "status":"ok",      "data":
      {
            "id":"18135798",            "name":"\u6b27\u9ea6\u560e\u5730",  "avatar":"http:\/\/u1.qhimg.com\/qhimg\/quc\/48_48\/22\/02\/55\/220255dq9816.3eceac.jpg?f=6c449fbaaa093e52b4053e46170af079",  "sex":"\u672a\u77e5",  "area":"",  "nick":"","access_token":"49395625948d4d6f253203e8aa8f3316150290e9d57be59b2","refresh_token":"493956259454b771dba785feeafb01221858440f4c811b5ad"
      },      "common":
       {
             "channel":"000023","user_sdk":"360","uid":"18135798"
             "server_id":""
       },     "ext":""
  }


//解析json
	int32_t index = reponse_data.find("{");
	if(-1 != index) {
		string in_data = reponse_data.substr(index,reponse_data.size()-index);
		Json::Reader reader;
		Json::Value value;
		if(reader.parse(in_data,value)) {
			if(value["status"].asstring() == "ok") {	
				if(!value["data"].isNull()) {	
					Json::Value data = value["data"];

					if (!data["nickname"].isNull()) {
						const char *name = data["nickname"].asCString();
						memcpy(plat_user->nick_name_,name,strlen(name));
					}

					if (!data["token"].isNull()) {
						const char *token = data["token"].asCString();
						memcpy(s_data->token,token,strlen(token));
						s_data->token[32] = '\0';
					}
				}

				if(!value["common"].isNull()) {		
					Json::Value data = value["common"];
					if (!data["channel"].isNull()) {
						const char *channel = data["channel"].asCString();
						memcpy(s_data->plat,channel,strlen(channel));
					}

					if (!data["uid"].isNull()) {
						const char *uid = data["uid"].asCString();
						memcpy(plat_user->user_id_,uid,strlen(uid));
					}
				}

				return 0;
			} else {
				return -1;		
			}
		}
	}


下载和编译

本文运行环境是: Redhat 5.5 + g++version 4.6.1 + GNU Make 3.81 + jsoncpp-0.5.0

下载地址是:http://sourceforge.net/projects/jsoncpp/

解压之后得到jsoncpp-src-0.5.0文件夹,我们只需要jsoncpp的头文件和cpp文件,其中jsonscpp的头文件位于jsoncpp-src-0.5.0\include\json,jsoncpp的cpp文件位于jsoncpp-src-0.5.0\src\lib_json。

这里我列出我们的工作目录:

jsoncpp/           //工作目录
|-- include        //头文件根目录
|  |-- json       //json头文件,对应jsoncpp-src-0.5.0\include\json
|-- src            //cpp源码文件根目录
  |-- json       //jsoncpp源码文件,对应jsoncpp-src-0.5.0\src\lib_json
  |-- main.cpp   //我们的主函数,调用jsoncpp的示例代码  

|-- makefile       //makefile,不用我们多说了吧,不懂请看我博客的makefile最佳实践

反序列化Json对象

假设有一个json对象如下:

{
    "name": "json″,"array": [
        {
            "cpp": "jsoncpp"
        },{
            "javajsoninjavaPHPsupport"
        }
    ]
}
我们要实现这个json的反序列化代码如下:
void readJson() {
    using namespace std;
    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;
        }   
    }   
}

序列化Json对象

void writeJson() {
    using namespace std;

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


JsonCpp使用优化



最近一个项目在使用JsonCpp,JsonCpp简洁易用的接口让人印象深刻。但是在实际使用过程中,我发现JsonCpp的性能却不尽如人意,所以想着方法优化下性能。

代码理解

1、JsonCpp中一切都是Value,Value用union指向自己保存的数据。Value的类型分为两种,一种是容器类型,比如arrayValue和objectValue。二者都是用map保存数据,只是arrayValue的key为数字而已。另外一种是基本类型,比如字符串,整型数字等等。

2、解释JSON数据时,JsonCpp在operator[]函数开销比较大。JsonCpp内部使用std::map,map在查找性能上不如hash_map,但是将map替换成hash_map有一定的困难,因为map的key为CZString,而这个类又是Value的内部类,导致不能定义hash_map需要的hash结构体。

本来想尝试下internal map,结果开启JSON_VALUE_USE_INTERNAL_MAP这个宏之后,根本通不过编译,因为value.h中有一处uion声明里面居然放的是结构体,不知道什么编译器支持这种语法。

基准测试程序

#include <iostream>
#include <string>
#include <sys/time.h>
#include <time.h>
#include <json/json.h>
 
using namespace std;
 
int64_t getCurrentTime()
{
    struct timeval tval;
    gettimeofday(&tval,NULL);
    return (tval.tv_sec * 1000000LL + tval.tv_usec);
}
 
char * str = "abcdefghijklmnopqrstuvwxyz";
 
void test1()
{
    int doc_count = 40;
    int outer_field_count = 80;
 
    Json::Value common_info;
 
    int64_t start_time = getCurrentTime();
 
    for(size_t i=0; i<doc_count; ++i)
    {
        Json::Value auc_info;
        for( size_t j=0 ; j<outer_field_count; ++j )
        {
            auc_info.append(str);
        }
        common_info.append(auc_info);
    }
 
    int64_t end_time = getCurrentTime();
 
    cout << "append time: " << end_time - start_time << endl;
}
 
void test2()
{
    int doc_count = 40;
    int outer_field_count = 80;
 
    Json::Value common_info;
 
    int64_t start_time = getCurrentTime();
 
    Json::Value auc_info;
 
    for(size_t i=0; i<doc_count; ++i)
    {
        for( size_t j=0 ; j<outer_field_count; ++j )
        {
            auc_info[j] = str;
        }
        common_info.append(auc_info);
    }
 
    int64_t end_time = getCurrentTime();
 
    cout << "opt append time: " << end_time - start_time << endl;
}
 
void test3()
{
    int doc_count = 40;
    int outer_field_count = 80;
 
    Json::Value common_info;
 
    int64_t start_time = getCurrentTime();
 
    Json::Value auc_info;
 
    for(size_t i=0; i<doc_count; ++i)
    {
        for( size_t j=0 ; j<outer_field_count; ++j )
        {
            auc_info[j] = Json::StaticString(str);
        }
        common_info.append(auc_info);
    }
 
    int64_t end_time = getCurrentTime();
 
    cout << "StaticString time: " << end_time - start_time << endl;
}
 
int main(int argc,const char *argv[])
{
    test1();
    test2();
    test3();
     
    return 0;
}


编译优化

默认情况下,JsonCpp编译时并没有带优化参数,自己可以加上优化参数。Linux环境下在下面这段代码中的CCFLAGS加入”O2″。

elifplatform.startswith('linux-gcc'):
env.Tool('default')
env.Append( LIBS =['pthread'],CCFLAGS ="-Wall -fPIC O2" )
env['SHARED_LIB_ENABLED']=True

可以看到使用O2优化比默认编译的版本性能提升一倍多。

append time: 4946
opt append time: 3326
StaticString time: 2750

append time: 1825
opt append time: 1082
StaticString time: 845

使用方法上的优化

测试代码中第三种方法比第一种方法效率提升了一倍多。第三种方法之所以效率更高,有两个原因。

1、首先是在循环中一直复用auc_info对象。第一个循环就能将auc_info的长度初始化为doc_count。通过下标的访问方法,一直复用数组中的元素。

2、如果key和value内存不会被释放,那么使用StaticString效率会更高,省去了构造CZString时拷贝的开销。

代码优化

因为在JsonCpp中一切都是Value,所以会有大量的隐性类型转换,要构造大量的Value对象。为了提高性能,可以在实现绕过这个机制,牺牲一致性。

因为Value最常用的类型是字符串,因此给Value增加一个setValue函数。

void Value::setValue(constStaticString& value )
{
type_ = stringValue;
allocated_ = false;
value_.string_ = const_cast<char*>( value.c_str() );
}

再测试一下性能,可以发现性能较第三种方法还有提升。
append time: 1849
opt append time: 1067
StaticString time: 843
setValue time: 570

最后还有一个办法就是静态链接。JsonCpp库本身非常小,将其静态链接能稍微提升一点性能。下面是静态链接时基准测试程序的耗时情况。
append time: 1682
opt append time: 1011
StaticString time: 801
setValue time: 541

参考:

http://www.searchtb.com/2012/11/jsoncpp-optimization.html

http://outofmemory.cn/code-snippet/1546/c-usage-jsonCpp-process-json-data

C++ qt 使用jsoncpp json 读写操作

C++ qt 使用jsoncpp json 读写操作

JsonCpp的使用

项目需要c++下使用json,我选择了JsonCpp,官网是:https://github.com/open-source-parsers/jsoncpp
解压后使用python编译出两个h文件和一个cpp文件:

(电脑需要安装python自己百度安装,这里就不说了)

安装python后,打开windows下cmd窗口,进入到jsoncpp文件夹  如图:

执行命令:python amalgamate.py 就会生成dist文件夹 里面有 json.h json-forwards.h jsoncpp.cpp三个文件:如下

将三个文件加入到工程即可使用,我是要qt进行测试使用:

main.cpp如下

#include <iostream>
#include <fstream>
#include "dist/json/json.h"
using namespace std;
 
int main(int argc, char *argv[])
{
    // write
    Json::Value people1;
    people1["name"] = "Dione";
    people1["sex"] = "男";
    people1["age"] = 24;
    people1["note"] = "jsoncpp write test!";
 
    Json::Value people2;
    people2["name"] = "Hulis";
    people2["sex"] = "女";
    people2["age"] = 22;
    people2["note"] = "jsoncpp write test!";
 
    Json::Value peoples;
    peoples.append(people1);
    peoples.append(people2);
 
    Json::Value writeValue;
    writeValue["classname"] = "三年一班";
    writeValue["peoples"] = peoples;
 
 
    Json::FastWriter fwriter;
    std::string strf = fwriter.write(writeValue);
    std::ofstream ofsf("example_fast_writer.json");
    ofsf << strf;
    ofsf.close();
 
    Json::StyledWriter swriter;
    std::string strs = swriter.write(writeValue);
    std::ofstream ofss("example_styled_writer.json");
    ofss << strs;
    ofss.close();
 
    // read
    string strValue = "{\"key1\":\"111\",\"array\":[{\"key2\":\"222\"},{\"key2\":\"333\"},{\"key2\":\"444\"}]}";
    Json::Reader reader;
    Json::Value root;
    if (reader.parse(strValue, root))
    {
        std::string out = root["key1"].asString();
        qDebug()<<QString::fromStdString(out);
        Json::Value arrayObj = root["array"];
        for (int i=0; i<arrayObj.size(); i++)
        {
            out = arrayObj[i]["key2"].asString();
            qDebug()<<QString::fromStdString(out);
        }
    }
 
    std::ifstream ifs("example_fast_writer.json");
    if (reader.parse(ifs, root))
    {
        std::string out = root["classname"].asString();
        qDebug()<<QString::fromStdString(out);
        Json::Value peoples = root["peoples"];
        for (int i=0; i<peoples.size(); i++)
        {
            qDebug()<<QString::fromStdString(peoples[i]["name"].asString());
            qDebug()<<QString::fromStdString(peoples[i]["sex"].asString());
            qDebug()<<QString::fromStdString(peoples[i]["age"].asString());
            qDebug()<<QString::fromStdString(peoples[i]["note"].asString());
        }
    }
 
    return 0;
}

会生成两个json文件,一个是没有格式写入一个是有格式写入,如下:

Demo工程下载地址:点击此处下载

到此这篇关于C++ qt 使用jsoncpp json 读写的文章就介绍到这了,更多相关C++ qt 使用jsoncpp json内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

您可能感兴趣的文章:
  • C/C++ QT实现解析JSON文件的示例代码
  • C/C++ Qt 运用JSON解析库的实例代码
  • Qt中JSON操作的具体使用

C++使用JsonCpp库操作json格式数据示例

C++使用JsonCpp库操作json格式数据示例

本文实例讲述了C++使用JsonCpp库操作json格式数据的方法。分享给大家供大家参考,具体如下:

前言

JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择

JSON的全称为:JavaScript Object Notation ,顾名思义,JSON是用于标记javascript对象的,详情参考http://www.json.org/。

本文选择第三方库JsonCpp来解析json,JsonCpp是比较出名的c++解析库,在json官网也是首推的。

JsonCpp简介

JsonCpp主要包含三种类型的class:Value Reader Writer。

jsoncpp中所有对象、类名都在namespace json中,包含json.h即可。

注意: Json::Value只能处理ANSI类型的字符串,如果C++程序使用Unicode编码的,最好加一个Adapt类来适配。

下载和编译

本文运行环境是: Redhat 5.5 + g++version 4.6.1 +  GNU Make 3.81 + jsoncpp-0.5.0

下载地址是:http://sourceforge.net/projects/jsoncpp/

解压之后得到jsoncpp-src-0.5.0文件夹,我们只需要jsoncpp的头文件和cpp文件,其中jsonscpp的头文件位于jsoncpp-src-0.5.0\include\json,jsoncpp的cpp文件位于jsoncpp-src-0.5.0\src\lib_json。

这里我列出我们的工作目录:

jsoncpp/           //工作目录
|-- include        //头文件根目录
|  |-- json       //json头文件,对应jsoncpp-src-0.5.0\include\json
|-- src            //cpp源码文件根目录
  |-- json       //jsoncpp源码文件,对应jsoncpp-src-0.5.0\src\lib_json
  |-- main.cpp   //我们的主函数,调用jsoncpp的示例代码
|-- makefile       //makefile,不用我们多说了吧,不懂请看本站相关的makefile用法实践

反序列化Json对象

假设有一个json对象如下:

{
  "name": "json″,"array": [
    {
      "cpp": "jsoncpp"
    },{
      "java": "jsoninjava"
    },{
      "PHP": "support"
    }
  ]
}

我们要实现这个json的反序列号代码如下:

void readJson() {
  using namespace std;
  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;
    }
  }
}

序列化Json对象

void writeJson() {
  using namespace std;
  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;
}

完整实例代码点击此处本站下载。

下载之后,执行以下命令

unzip jsoncpp.zip
cd jsoncpp
make
./main

PS:关于json操作,这里再为大家推荐几款比较实用的json在线工具供大家参考使用:

在线JSON代码检验、检验、美化、格式化工具:
http://tools.jb51.net/code/json

JSON在线格式化工具:
http://tools.jb51.net/code/jsonformat

在线XML/JSON互相转换工具:
http://tools.jb51.net/code/xmljson

json代码在线格式化/美化/压缩/编辑/转换工具:
http://tools.jb51.net/code/jsoncodeformat

在线json压缩/转义工具:
http://tools.jb51.net/code/json_yasuo_trans

希望本文所述对大家C++程序设计有所帮助。

C++通过jsoncpp类库读写JSON文件-json用法详解

C++通过jsoncpp类库读写JSON文件-json用法详解

介绍:

JSON 是常用的数据的一种格式,各个语言或多或少都会用的JSON格式。

JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择。JSON的全称为:JavaScript Object Notation ,顾名思义,JSON是用于标记javascript对象的。

编译方法:

使用Jsoncpp生成的lib文件:

首先下载Jsoncpp源码文件,用cmake编译主目录中的CMakeLists.txt,之后打开sln文件,进行编译,会在src\lib_json文件夹中生成Debug和Release版本的lib文件。
在工程中引用,只需要在链接器的附加依赖项中加入lib文件名,附加库目录中添加lib路径,之后#include<json.h>文件即可。

jsoncpp 使用详解

jsoncpp 主要包含三种类型的 class:Value、Reader、Writer。jsoncpp 中所有对象、类名都在 namespace Json 中,包含 json.h 即可。

Json::Value 只能处理 ANSI 类型的字符串,如果 C++ 程序是用 Unicode 编码的,最好加一个 Adapt 类来适配。

举例子之前首先推荐一个在线解析json格式的网站,具体格式用法如下图所示:

之后根据这个格式进行json数据解析。

json用法实例:

1)从字符串中读取JSON

#include <string>
#include <json/json.h>
#include <iostream>
#include <fstream>
using namespace std;
 
void readStrJson(); //从字符串中读取JSON
void readStrProJson(); //从字符串中读取JSON(内容复杂些)
 
int main(int argc, char *argv[]) 
{
	readStrJson();
	
	cout << "\n\n";
	readStrProJson();
	
	return 0;
}
 
//从字符串中读取JSON
void readStrJson() 
{
	//字符串
  const char* str = 
      "{\"praenomen\":\"Gaius\",\"nomen\":\"Julius\",\"cognomen\":\"Caezar\","
      "\"born\":-100,\"died\":-44}";
      
  /*
  //json内容如下:
  {
		"praenomen":"Gaius",
		"nomen":"Julius",
		"cognomen":"Caezar",
		"born":-100,
		"died":-44 
	}
  */
 
  Json::Reader reader;
  Json::Value root;
 
  //从字符串中读取数据
  if(reader.parse(str,root))
  {
      string praenomen = root["praenomen"].asString();
      string nomen = root["nomen"].asString();
      string cognomen = root["cognomen"].asString();
      int born = root["born"].asInt();
      int died = root["died"].asInt();
 
      cout << praenomen + " " + nomen + " " + cognomen
          << " was born in year " << born 
          << ", died in year " << died << endl;
  }
  
}
 
//从字符串中读取JSON(内容复杂些)
void readStrProJson() 
{
	string strValue = "{\"name\":\"json\",\"array\":[{\"cpp\":\"jsoncpp\"},{\"java\":\"jsoninjava\"},{\"php\":\"support\"}]}";
	/*
	//json内容如下:
	{
    "name": "json″,
    "array": [
        {
            "cpp": "jsoncpp"
        },
        {
            "java": "jsoninjava"
        },
        {
            "php": "support"
        }
    ]
	}
	*/
 
 
	Json::Reader reader;
	Json::Value value;
 
	if (reader.parse(strValue, value))
	{
		string out = value["name"].asString();
		cout << out << 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();
			cout << out;
			if (i != (arrayObj.size() - 1))
				cout << endl;
		}
	}
}

输出结果:

2)从文件中读取JSON

#include <string>
#include <json/json.h>
#include <iostream>
#include <fstream>
using namespace std;
 
void readFileJson(); //从文件中读取JSON,一个存储了JSON格式字符串的文件
 
int main(int argc, char *argv[]) 
{
	readFileJson();
	
	return 0;
}
 
//从文件中读取JSON
void readFileJson()
{
	Json::Reader reader;
	Json::Value root;
 
	//从文件中读取,保证当前文件有test.json文件
	ifstream in("test.json", ios::binary);
	//in.open("test.json", ios::binary);
 
	if( !in.is_open() )  
	{ 
	cout << "Error opening file\n"; 
	return; 
	}
 
	/*
	//test.json内容如下:
	{
		"name":"Tsybius",
		"age":23,
		"sex_is_male":true,
		"partner":
		{
			"partner_name":"Galatea",
			"partner_age":21,
			"partner_sex_is_male":false
		},
		"achievement":["ach1","ach2","ach3"]
	}
	*/
 
	if(reader.parse(in,root))
	{
	//读取根节点信息
	string name = root["name"].asString();
	int age = root["age"].asInt();
	bool sex_is_male = root["sex_is_male"].asBool();
 
	cout << "My name is " << name << endl;
	cout << "I''m " << age << " years old" << endl;
	cout << "I''m a " << (sex_is_male ? "man" : "woman") << endl;
 
	//读取子节点信息
	string partner_name = root["partner"]["partner_name"].asString();
	int partner_age = root["partner"]["partner_age"].asInt();
	bool partner_sex_is_male = root["partner"]["partner_sex_is_male"].asBool();
 
	cout << "My partner''s name is " << partner_name << endl;
	cout << (partner_sex_is_male ? "he" : "she") << " is "
		<< partner_age << " years old" << endl;
 
	//读取数组信息
	cout << "Here''s my achievements:" << endl;
	for(unsigned int i = 0; i < root["achievement"].size(); i++)
	{
		string ach = root["achievement"][i].asString();
		cout << ach << ''\t'';
	}
	cout << endl;
 
	cout << "Reading Complete!" << endl;
	}
	else
	{
	cout << "parse error\n" << endl;	
	}
 
	in.close();
}

3)将信息保存为JSON格式

#include <string>
#include <json/json.h>
#include <iostream>
#include <fstream>
using namespace std;
 
void writeFileJson();//将信息保存为JSON格式
 
int main(int argc, char *argv[]) 
{
	writeFileJson();
	
	return 0;
}
 
//将信息保存为JSON格式
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();
	
	/*
	//json文件内容如下:
	{
		"achievement" : [ "ach1", "ach2", "ach3" ],
		"age" : 23,
		"name" : "Mike Jiang",
		"partner" : {
			"partner_age" : 21,
			"partner_name" : "Galatea",
			"partner_sex_is_male" : false
		},
		"sex_is_male" : true
	}
	*/
 
}

输出结果:

demo.json文件内容如下:

{
		"achievement" : [ "ach1", "ach2", "ach3" ],
		"age" : 23,
		"name" : "Mike Jiang",
		"partner" : {
			"partner_age" : 21,
			"partner_name" : "Galatea",
			"partner_sex_is_male" : false
		},
		"sex_is_male" : true
	}

另一个例子:


#include <json/json.h>
#include <string>
#include <iostream>
using namespace std;
 
 
int main()
{
    //std::string strValue = "{\"name\":\"json\",\"array\":[{\"cpp\":\"jsoncpp\"},{\"java\":\"jsoninjava\"},{\"php\":\"support\"}]}";    
    
    // 构建json数组
    Json::Value array;
    Json::Value root;
    Json::Value person;
    
    Json::FastWriter writer;
 
 
    person["name"] = "allen";
    person["age"] = 10; 
    person["sex"] = "male";
    root.append(person);
 
    person["name"] = "keiv";
    person["age"] = 20; 
    person["sex"] = "female";
    root.append(person);
    
    person["name"] = "lihua";
    person["age"] = 10; 
    person["sex"] = "female";
    root.append(person);
 
    // 添加数组格式
    //array["array"].append(root);
    
    // 子节点挂到根节点上
    array["array"] = Json::Value(root);
 
    string data = writer.write(array);
 
    //cout<<data<<endl;  
    //cout<<array.toStyledString()<<endl;
    
    
// 解析Json字符串
    string strValue = array.toStyledString();      // json对象转变为json字符串
    cout<<strValue<<endl;
 
    Json::Reader reader;
    Json::Value value;
 
    if (reader.parse(strValue, value))            // json字符串转为json对象
    {   
        for (unsigned int i = 0; i < value["array"].size(); i++)
        {   
            string name = value["array"][i]["name"].asString();
            int     age = value["array"][i]["age"].asInt();
            string sex  = value["array"][i]["sex"].asString();
 
            cout<<name<<" "<<age<<" "<<sex<<endl;
        }
    }
 
    return 0;
}
后记:

在json中检测某个字段是否存在的两个方法如下:

if (root["url"].type() != Json::nullValue){
    //url字段存在
}
if(value["sex"].isNull()){
    //sex字段存在
}

以上就是常用的json语法,后续有用的新的语法会继续补充。

更多参考:一, 二, 三

原文出处:https://www.cnblogs.com/ZY-Dream/p/10054074.html

Centos下 jsoncpp使用详解

Centos下 jsoncpp使用详解

Windows环境下的jsoncpp使用举例之前有讲述,详见:
http://www.jb51.cc/article/p-oswexnkv-bcr.html
Linux之前一直没有用过,第一次用,特备忘如下:

1、Centos下 jsoncpp的安装步骤

第一步:下载jsoncpp

0.5.0版本地址:https://sourceforge.net/projects/jsoncpp/
个人感觉早期版本0.5.0更稳定些。
官网地址:https://github.com/open-source-parsers/jsoncpp

第二步:安装scons

编译jsoncpp需要使用scons。
下载scons地址:https://sourceforge.net/projects/scons/files/scons/2.1.0/
现在已经有新版本,但2.1.0测试相对好用。

第三步:编译scons

tar -zvxf scons-2.1.0.tar.gz
1)在/etc/profile 设置环境变量
export MYSCONS=解压的路径
export SCONS_LIB_DIR=$MYSCONS/engine
注意:这两个环境变量至关重要。

运行: source /etc/profile 使设置的新环境变量生效。

注: scons是一个Python写的自动化构建工具,从构建这个角度说,它跟GNU make是同一类的工具。
它是一种改进,并跨平台的gnu make替代工具,其集成功能类似于autoconf/automake 。
scons是一个更简便,更可靠,更高效的编译软件。

第四步:解压jsoncpp

tar -zvxf jsoncpp-src-0.5.0.tar.gz

第五步:切换到jsoncpp的解压目录,执行命令

python $MYSCONS/script/scons platform=linux-gcc
我的路径为:/home/yang/MysqL_y/jsoncpp-src-0.5.0
执行:

第六步:生成静态和动态库文件

在jsoncpp-src-0.5.0/libs/linux-gcc-4.4.7目录下,如下所示:
[root@yang linux-gcc-4.4.7]# pwd
/home/yang/MysqL_ycy/jsoncpp-src-0.5.0/libs/linux-gcc-4.4.7
[root@lyang linux-gcc-4.4.7]# ll
-rw-r–r– 1 root root 618712 9月 9 13:43 libjson_linux-gcc-4.4.7_libmt.a
-rwxr-xr-x 1 root root 359045 9月 9 13:43 libjson_linux-gcc-4.4.7_libmt.so

第七步:

可将 libjson_linux-gcc-4.4.7_libmt.a 和 libjson_linux-gcc-4.4.7_libmt.so 拷贝到/usr/lib下,
本文选择了静态库库文件,将解压后的文件夹下的INCLUDE中的头文件拷贝到/usr/include/json下。

2、Demo程序测试验证功能是否ok。

有如下最终结果输出的为ok!

[root@yang json_test0922]# cat json_test.cpp
#include <json/json.h>
#include <string>
#include <iostream>
using namespace std;

int main()
{
string test = "{\"encrptpripid\": \"f2cbfd07bb6b784f0fb5a52e17e1b3930324e1ef9065338f4aa1\",\ \"entname\": \"xx显华化工科技有限公司\",\   \"enttype\": \"1151\",\   \"enttypename\": \"法定代表人:\",\   \"estdate\": \"2003年06月19日\",\   \"lerep\": \"丰佩川\",\   \"pripid\": \"106350010220030687030\",\   \"regno\": \"911706007526952553\",\   \"regorgname\": \"XX经济技术开发区市场监督管理局\",\   \"uniscid\":\"91106007526952553\"}";

Json::Reader reader;
Json::Value value;
if(reader.parse(test,value))
{
  if(!value["encrptpripid"].isNull())
  {
  cout << value["entname"].asstring() << endl;
  cout << value["regorgname"].asstring()<< endl;
  }
}
return 0;
}
[root@yang json_test0922]# cat makefile
json_test:json_test.cpp
  g++ -o json_test json_test.cpp /usr/lib/libjson_linux-gcc-4.4.7_libmt.a
[root@yang json_test0922]# ./json_test
xx显华化工科技有限公司
XX经济技术开发区市场监督管理局

3、常见错误:

错误1:MysqL_parse: src/lib_json/json_value.cpp:1025: Json::Value& Json::Value::resolveReference(const char*,bool): Assertion `type_ == nullValue || type_ == objectValue’ Failed.
解决方案:json的内容的前面的”[” 以及后面的”]”去掉即可。

2016-9-21 pm20:59 思于家中床前
作者:铭毅天下
转载请标明出处,原文地址:http://www.jb51.cc/article/p-aiiazqec-bcx.html 如果感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!

今天的关于jsonCpp使用介绍和优化jsoncpp用法的分享已经结束,谢谢您的关注,如果想了解更多关于C++ qt 使用jsoncpp json 读写操作、C++使用JsonCpp库操作json格式数据示例、C++通过jsoncpp类库读写JSON文件-json用法详解、Centos下 jsoncpp使用详解的相关知识,请在本站进行查询。

本文标签: