[VALUE]
Json::Value 类:
Json::Value json_temp; // 临时对象
json_temp["name"] = Json::Value("huchao");
json_temp["age"] = Json::Value(26);
Json::Value root; // 表示整个 json 对象
root["key_string"] = Json::Value("value_string"); // 新建一个 Key(名为:key_string),赋予字符串值:"value_string"
root["key_number"] = Json::Value(12345); // 新建一个 Key(名为:key_number),赋予数值:12345。
root["key_boolean"] = Json::Value(false); // 新建一个 Key(名为:key_boolean),赋予bool值:false。
root["key_double"] = Json::Value(12.345); // 新建一个 Key(名为:key_double),赋予 double 值:12.345。
root["key_object"] = Json_temp; // 新建一个 Key(名为:key_object),赋予 json::Value 对象值。
root["key_array"].append("array_string"); // 新建一个 Key(名为:key_array),类型为数组,对第一个元素赋值为字符串:"array_string"。
root["key_array"].append(1234); // 为数组 key_array 赋值,对第二个元素赋值为:1234。
Json::ValueType type = root.type(); // 获得 root 的类型,此处为 objectValue 类型。
[WRITE]
Jsoncpp 的 Json::Writer 类是一个纯虚类,并不能直接使用。在此我们使用 Json::Writer 的子类:Json::FastWriter、Json::StyledWriter、Json::StyledStreamWriter。
顾名思义,用 Json::FastWriter 来处理 json 应该是最快的。
#include<windows.h>
#include <json.h>
int _tmain(int argc, _TCHAR* argv[])
{
Json::Value json_temp; //创建临时对象
json_temp["name"] = Json::Value("huchao");
json_temp["age"] = Json::Value(26);
Json::FastWriter fast_write; //Json::FastWrite 是一个纯虚类不能直接使用
std::cout<< fast_write.write(json_temp) << std::endl; //输出结果 {"age":26,"name":"huchao"}
std::string sStr = fast_write.write(json_temp);
printf("%s\n", sStr.c_str());
Json::StyledWriter styled_write; //Json::StyledWrite 格式化以后的 Json
std::cout << styled_write.write(json_temp) << std::endl;
//输出结果:
//{
// "age" : 26,
// "name" : "huchao"
//}
Sleep(1000000);
return 0;
}
[VALUE]
Json::Reader 是用于读取的,说的确切点,是用于将字符串转换为 Json::Value 对象的。
下面我们来看个简单的例子。
#include<windows.h>
#include <json.h>
int _tmain(int argc, _TCHAR* argv[])
{
Json::Reader reader;
Json::Value json_object;
const char* json_document = "{\"age\" : 26,\"name\" : \"huchao\"}";
if (!reader.parse(json_document, json_object))
return 0;
std::cout << json_object["name"] << std::endl; //输出结果为:"huchao"
std::cout << json_object["age"] << std::endl; //输出结果为:26
Sleep(1000000);
return 0;
}
来自于:http://www.cnblogs.com/kex1n/archive/2011/12/02/2272328.html
Jsoncpp的使用
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
JSON建构于两种结构:
- “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
- 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
JSON具有以下这些形式:
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
值(value)可以是双引号括起来的字符串(string)、数值(number)、true
、false
、 null
、对象(object)或者数组(array)。这些结构可以嵌套。
字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。
字符串(string)与C或者Java的字符串非常相似。
数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
空白可以加入到任何符号之间。 以下描述了完整的语言。
C++要使用JSON来解析数据,一般采用jsoncpp.
网站:http://sourceforge.net/projects/jsoncpp/
下载了之后,解压,然后打开\jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\makefiles\vs71
下的工程文件,进行编译链接就可以得到一个静态链接库json.lib
要用jsoncpp只需要将这个lib文件拷贝到你的工程目录下,并将jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\include\json
复制到工程目录下,然后将这些头文件加到工程中去就可以了。
例子:
{
"name" : "小楼一夜听春雨",
"age" : 27
}
#pragma comment(lib, "json_mtd.lib")
#include <fstream>
#include <cassert>
#include "json/json.h"
int main()
{
ifstream ifs;
ifs.open("testjson.json");
assert(ifs.is_open());
Json::Reader reader;
Json::Value root;
if (!reader.parse(ifs, root, false))
{
return -1;
}
std::string name = root["name"].asString();
int age = root["age"].asInt();
std::cout<<name<<std::endl;
std::cout<<age<<std::endl;
return 0;
}
[{"name" : "xiaoy", "age" :17} , {"name" : "xiaot", "age" : 20}]
#pragma comment(lib, "json_mtd.lib")
#include <fstream>
#include <cassert>
#include "json/json.h"
int main()
{
ifstream ifs;
ifs.open("testjson.json");
assert(ifs.is_open());
Json::Reader reader;
Json::Value root;
if (!reader.parse(ifs, root, false))
{
return -1;
}
std::string name;
int age;
int size = root.size();
for (int i=0; i<size; ++i)
{
name = root[i]["name"].asString();
age = root[i]["age"].asInt();
std::cout<<name<<" "<<age<<std::endl;
}
return 0;
}
json写入:
#pragma comment(lib, "json_mtd.lib")
#include <fstream>
#include <cassert>
#include "json/json.h"
int main()
{
Json::Value root;
Json::FastWriter writer;
Json::Value person;
person["name"] = "hello world";
person["age"] = 100;
root.append(person);
std::string json_file = writer.write(root);
ofstream ofs;
ofs.open("test1.json");
assert(ofs.is_open());
ofs<<json_file;
return 0;
}
结果:[{"age":100,"name":"hello world"}]
json对数组的解析还支持STL的风格。即
for (Json::Value::iterator itr = objArray.begin(); itr != objArray.end(); itr ++ )
{
member = ( * itr).getMemberNames();
for (Json::Value::Members::iterator iter = member.begin(); iter != member.end(); iter ++ )
{
string str_temp = ( * itr)[( * iter)].asString();
}
}
此种风格与上面的类似,只是上面的只是取"text"节点,而后一种是输出所有节点。