使用jsoncpp解析JSON数据
2013-11-03 21:53
543 查看
使用jsoncpp解析JSON数据
(转自http://www.cppfans.org/1445.html,谢谢作者的分享)1.jsoncpp是什么?
jsoncpp是一个使用C++语言来解析json文件的开源库,其项目地址为:http://sourceforge.net/projects/jsoncpp/,属于免费项目,任何人都可以下载使用
2. 编译jsoncpp
jsoncpp文件中提供了vs71的工程文件以及makerelease.py文件,用来编译,里面分为jsontest、lib_json、test_lib_json三个工程,按照自己需要的编译。
注意:如果使用VS默认的编译选项MTd或者MT,在使用json_libmtd.lib的时候可能会出现LNK2038错误(我使用的VS2012
vc110环境),所以请修改MTD为MDd,MT为MD。
3.使用jsoncpp读JSON文件
如何将lib库添加进VS工程中在此就不赘述了。先看第一个读文件的例
// JSON文件
{"address":[
{"name":"eliteYang",
"email":"elite_yang@163.com"},
{"name":"AAA",
"email":"aaa@163.com"},
{"name":"BBB",
"email":"bbb@163.com"}
]}
/**
*
file : jsoncpp_test.cpp
*
author : eliteYang
*
email : elite_yang@163.com
*
blog : http://www.cppfasn.org
*
desc : json cpp test
*/
#include <fstream>
#include <string>
#include "jsoncpp/json.h"
int
_tmain(int
argc,
_TCHAR*
argv[])
{
std::ifstream
ifs;
ifs.open("test.json");
Json::Reader
reader;
Json::Value
root;
if
(!reader.parse(ifs,
root,
false))
{
return
-1;
}
Json::Value
add_value
=
root["address"];
for
(int
i
=
0;
i
<
add_value.size();
++i)
{
Json::Value
temp_value
=
add_value[i];
std::string
strName
=
temp_value["name"].asString();
std::string
strMail
=
temp_value["email"].asString();
std::cout
<<
"name: "
<<
strName
<<
" email: "
<<
strMail
<<
std::endl;
//
use value array[index]
//Json::Value
temp_value = add_value[i];
//std::string
strName = add_value[i]["name"].asString();
//std::string
strMail = add_value[i]["email"].asString();
//std::cout
<< "name: " << strName << " email: " << strMail << std::endl;
}
system("Pause");
return
0;
}
结果:
name:
eliteYang
email:
elite_yang@163.com
name:
AAA
email:
aaa@163.com
name:
BBB
email:
bbb@163.com
请按任意键继续.
.
.
跟我们文件中的数据完全一致。
4.使用JSON写入一块数据
我们继续使用上述文件,在中间加上一块数据。我们插入一个新的{"name": "append", "email": "append@163.com"}
/**
*
file : jsoncpp_test.cpp
*
author : eliteYang
*
email : elite_yang@163.com
*
blog : http://www.cppfasn.org
*
desc : json cpp test
*/
#include <fstream>
#include <string>
#include "jsoncpp/json.h"
int
_tmain(int
argc,
_TCHAR*
argv[])
{
std::ifstream
ifs;
ifs.open("test.json");
Json::Reader
reader;
Json::Value
root;
if
(!reader.parse(ifs,
root,
false))
{
return
-1;
}
Json::Value&
add_value
=
root["address"];
Json::Value
append_value;
append_value["name"]
=
"append";
append_value["email"]
=
"append@163.com";
add_value.append(append_value);
for
(int
i
=
0;
i
<
add_value.size();
++i)
{
Json::Value
temp_value
=
add_value[i];
std::string
strName
=
temp_value["name"].asString();
std::string
strMail
=
temp_value["email"].asString();
std::cout
<<
"name: "
<<
strName
<<
" email: "
<<
strMail
<<
std::endl;
}
Json::FastWriter
writer;
std::string
json_append_file
=
writer.write(root);
std::ofstream
ofs;
ofs.open("test_append.json");
ofs
<<
json_append_file;
system("Pause");
return
0;
}
结果:
name:
eliteYang
email:
elite_yang@163.com
name:
AAA
email:
aaa@163.com
name:
BBB
email:
bbb@163.com
name:
append
email:
append@163.com
请按任意键继续.
.
.
//
test_append.json
{"address":[{"email":"elite_yang@163.com","name":"eliteYang"},{"email":"aaa@163.com","name":"AAA"},{"email":"bbb@163.com","name":"BBB"},{"email":"append@163.com","name":"append"}]}
当然了,jsoncpp对数组的解析也支持STL中迭代器的风格,不过我个人觉得还是数组好理解一些。迭代器的解析风格就不写了,大家可以自己摸索下,主要是使用Json::Value::Members。
JSON官方还是非常推荐用jsoncpp来解析JSON文件的,大家也看到了,确实比较方便。
相关文章推荐
- C++使用Jsoncpp解析Json数据
- 【C++】JSON数据解析——jsoncpp的使用(上)
- 【C++】JSON数据解析——jsoncpp的使用
- JSON数据解析——jsoncpp的使用(上)
- 【C++】JSON数据解析——jsoncpp的使用
- JSON数据解析——jsoncpp的使用
- 【C++】JSON数据解析——jsoncpp的使用
- 使用jsoncpp解析JSON数据
- C++使用 jsoncpp 解析json数据
- 【C++】JSON数据解析——jsoncpp的使用(下)
- C++ Builder 使用 JsonCpp 解析json格式数据方法( 支持 UNICODE (UTF-16) / UTF-8 )
- C++之使用jsoncpp解析json数据
- 使用JsonCPP解析JSON数据 C++
- 使用jsoncpp解析JSON数据(转)
- 使用JsonCPP解析JSON数据(VC++)
- ios中使用 NSJSONSerialization对 json数据的解析
- Java使用org.json.jar构造和解析Json数据
- 在Android中可以使用Gson解析JSON数据
- 使用jQuery解析JSON数据
- 使用Gson解析复杂的json数据