QJSON
JSON(JavaScript Object Notation)是一个轻量级的数据交换格式; 可以将数据以name/value的形式任意组合;
QJson 是一个基于Qt的库, 将JSON的数据map成name-QVariant的形式, 或者进行反相转换; 通过Q_PROPERTY还可以转换QObject类中的数据;
QJSON Source http://qjson.sourceforge.net/ (需要编译lib来link)
Build 测试时在Windows下进行, 所以我尝试用UI的方式编译:
1. 用QtCreator打开CMakeList.txt, 进行Configure;
2. 生成了qjson项目, Build All
Note 这里有个error, '_strtoui64' was not declared in this scope, 是作者在修VS2012的bug时introduce的, 只要找到json_scanner.cc, 把strtoll和strtoull两个宏注释掉就行;
3. 在Qt项目中引入QJSN的library, QJSON对QtCore有dependency.
LIBS += -L"PathToQJSONLib" -l"qjson"
e.g. 格式: String必须用"" 包括起来, 使用"\"来转义字符;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
QString query(
"{\"name\":\"newName\",\"size\":\"Godzilla\", \"price\":111.222}"
);
//parse
QByteArray json = query.toUtf8();
QJson::Parser parser;
bool
ok;
QVariantMap result = parser.parse (json, &ok).toMap();
if
(ok)
{
QHash<
int
, QByteArray> roleNames = item->roleNames();
QHash<
int
, QByteArray>::iterator iter;
for
(iter = roleNames.begin(); iter != roleNames.end(); ++iter)
{
if
(result.value(iter.value()).isValid())
item->setData(iter.key(), result.value(iter.value()));
else
cout<<
"no data"
<<endl;
cout<<(
int
)(iter.key())<<
"&"
<<iter.value().data()<<endl;
cout<<(result.value(iter.value())).toString().toUtf8().data()<<endl;
}
}
else
Q_ASSERT(
"An error occurred during parsing"
);
|
>对于list的数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
QString query(
"[ {\"id\":\"Banana\", \"name\":\"111\",\"size\":\"Godzilla\", \"price\":111.222}, {\"id\": \"Grape\", \"name\":222,\"size\":\"GodzillA\", \"price\":33333} ]"
);
//
//parse
QVariant data = parser.parse (json, &ok);
if
(ok)
{
QVariantList list = data.toList();
for
(
int
i = 0; i < list.size(); i++)
{
QVariantMap listData = list.at(i).toMap();
ListItem* item = GetListModel()->find(listData[
"id"
].toString());
if
(item != NULL)
//...
}
}
|
Other
QML&JSON http://qt-project.org/forums/viewthread/2057
Qt使用JSON: http://stackoverflow.com/questions/4169988/easiest-way-to-parse-json-in-qt-4-7
Lighter version: qt-json: https://github.com/ereilin/qt-json (需要将文件加入Project)
---End---
XML
XML(eXtensible Markup Language) 可扩展标记语言;
Qt中读取XML数据的方式好像有不少, 测试了一个节点方式的:
QDomDocument 代表一个XML文件, 一个文件树的root节点; setContent()把XML文档从字节数组转化成内容设给DOMDoc.
QDomNode DOM Tree的基类; QDomElement 代表DOM tree上的一个元素;
XML: Dictionary.xml
1
2
3
4
5
6
7
|
<?
xml
version
=
"1.0"
encoding
=
"Unicode-1-1-utf-8"
?>
<
strings
>
<
localeName
>English_United_States</
localeName
>
<
string
id
=
"101"
text
=
"Phone"
/>
<
string
id
=
"100"
text
=
"Name"
/>
<
string
id
=
"99"
text
=
"Address"
/>
</
strings
>
|
Function: XMLParse
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
|
typedef
QMap <
int
, QString> MY_MAP;
bool
XMLparse(QString& locName, MY_MAP& map)
{
QDomDocument doc;
QFile file(
"R:\\Projects\\Data.xml"
);
if
(!file.open(QIODevice::ReadOnly))
return
false
;
if
(!doc.setContent(&file)) {
file.close();
return
false
;
}
file.close();
QDomElement docElem = doc.documentElement();
QDomNode n = docElem.firstChild();
if
(n.isNull())
return
false
;
while
(!n.isNull()) {
QDomElement e = n.toElement();
if
(!e.isNull()) {
if
(e.tagName().compare(
"localeName"
) == 0)
locName = e.text();
if
(e.tagName().compare(
"string"
) == 0)
{
bool
ok;
int
id = e.attribute(
"id"
).toInt(&ok);
Q_ASSERT(ok);
if
(!map.contains(id))
map.insert(id, e.attribute(
"text"
));
//qDebug() << qPrintable(e.attribute("id"));
//qDebug() << qPrintable(e.attribute("text"));
}
}
n = n.nextSibling();
}
return
true
;
}
|
Usage:
1
2
3
|
QString locName;
PHRASE_MAP map;
bool
res = XMLparse(locName, map);
|
---End---