转自: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工程中在此就不赘述了。先看第一个读文件的例
1
2
3
4
5
6
|
// JSON文件
{
"address"
:
[
{
"name"
:
"eliteYang"
,
"email"
:
"elite_yang@163.com"
}
,
{
"name"
:
"AAA"
,
"email"
:
"aaa@163.com"
}
,
{
"name"
:
"BBB"
,
"email"
:
"bbb@163.com"
}
]
}
|
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
/**
* 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"
@H_576_301@
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
;
}
|
结果:
1
2
3
4
|
name
:
eliteYang
email
:
elite_yang
@
163.com
name
:
AAA
email
:
aaa
@
163.com
name
:
BBB
email
:
bbb
@
163.com
请按任意键继续
.
.
.
|
跟我们文件中的数据完全一致。
4.使用JSON写入一块数据
我们继续使用上述文件,在中间加上一块数据。我们插入一个新的@H_403_929@{"name": "append","email": "append@163.com"}
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
/**
* 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
,
false
)
)
{
return
-
1
;
}
Json
::
Value
&
add_value
=
root
[
"address"
]
;
Json
::
Value
append_value
;
@H_827_1301@
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
;
}
|
结果:
1
2
3
4
5
|
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
请按任意键继续
.
.
.
|
1
2
|
// 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文件的,大家也看到了,确实比较方便。
btw.因为这两天笔记本散热不好,所以接了套螺丝刀将笔记本大卸八块,扫了扫灰,然后又装上了,结果神奇的就好了,果然是贱啊,欠拆。所以json系列的文章就晚了几天,非常抱歉,好了,不早了,该睡觉了,各位晚安。