Jsoncpp使用简介

Jsoncpp编译环境配置

1.      下载Jsoncpp最新源码,不同版本配置可能有细微区别,作者使用的是jsoncpp-0.10.2(https://github.com/open-source-parsers/jsoncpp/releases)

2.      在vs中打开源码工程(如F:\devlib\jsoncpp-0.10.2\makefiles\msvc2010),选择对应的开发模式Debug或Release,生成解决方案,就会生成相应的库;

3.      新建工程,选择属性àc/c++à附加包含目录,填上Json库include目录路径(如F:\devlib\jsoncpp-0.10.2\include),选择连接器à附加库目录,填上步骤2中生成的库目录(如F:\devlib\jsoncpp-0.10.2\makefiles\msvc2010\Debug),选择连接器à输入à附加依赖项,填上步骤2中生成的库名(如lib_json.lib),特别需要注意的是要把c/c++à代码生成à运行库的模式调成跟原Json工程中一致(如多线程调试/MTd

Jsoncpp基本用法说明

Json元素类型大概分3类:数组、json::Value对象、其他(int、string、double、bool、null等),如下Json窜:

{"array":[1,2,3],"boolean":true,"null":null,"int":123,"double":11.222,"object":{"a":"A","b":"B","v":"C"},"string":"你好"}

Jsoncpp中关键的类有3种Value、Reader、Writer的子类FastWriter与StyledWriter,Value类中有一个重要的重定义类型为Members(typedef std::vector<std::string> Members),可以用其迭代器访问元素,注意此类型只对Json::Value生效,不能作用于数组。Reader类主要提供了prase()方法用于反序列化数据,Writer子类主要提供了write()方法用于序列化数据。(特别要注意数组与Json::Value的区别,为这作者就没吃上午饭)

简单代码举例

#include <iostream>
#include <string>
#include <cassert>
#include "json/json.h"

using namespace std;

static void printValueTree(Json::Value& value, char* name="")
{
	if (Json::objectValue == value.type())
	{
		Json::Value::Members members(value.getMemberNames());
		Json::Value::Members::iterator it = members.begin();
		for (; it != members.end(); ++it)
		{
			name = (char*)(*it).c_str();
			printValueTree(value[name], name);
		}
	}
	else if (Json::arrayValue == value.type())
	{
		cout << name << ":" << value << endl;
	}
	else
	{
		cout << name << ":" << value << endl;
	}

}

bool readJson(const string &str)
{
	if (str.empty())
	{
		return false;
	}  
	Json::Reader reader;
	Json::Value value;
	if (!reader.parse(str, value))
	{
		return false;
	}
	printValueTree(value);
}

void writeJson(const string &str)
{
	Json::Value value;

	value["array"].append(1);
	value["array"].append(2);
	value["array"].append(3);

	value["boolean"] = true;
	value["null"];
	value["int"] = 123;
	value["double"] = 11.222;

	value["object"]["a"] = "A";
	value["object"]["b"] = "B";
	value["object"]["c"] = "C";

	value["string"] = "你好";

	Json::FastWriter fWriter;
	Json::StyledWriter sWriter;
	
	cout << "原数据:" << endl;
	cout << str << endl;
	cout << "快速写数据:" << endl;
	cout << fWriter.write(value) << endl;
	cout << "带样式数据:" << endl;
	cout << sWriter.write(value) << endl;
}

int main()
{
	string strValue1 = "{\"array\":[1,2,3],\"boolean\":true,\"null\":null,\"int\":123,\"double\":11.222,\"object\":{\"a\":\"A\",\"b\":\"B\",\"c\":\"C\"},\"string\":\"你好\"}";
	
	writeJson(strValue1);
	readJson(strValue1);

	return 0;
}

运行结果:


问题来了:原数据与快速写数据元素顺序不一样,而带样式数据元素顺序相同。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值