Qt读取JSON和XML数据
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---
Qt读取JSON和XML数据的更多相关文章
- iOS开发——网络Swift篇&JSON与XML数据解析
JSON与XML数据解析 JSON数据解析(内置NSJSONSerialization与第三方JSONKit) 一,使用自带的NSJSONSerialization 苹果从IOS5.0后推出了SD ...
- php生成json或者xml数据
, ,'数据返回成功',$arr);echo $xml;?>
- C#解析json和xml数据
C#解析json和xml数据 // 用到的包using Newtonsoft.Json; // using Newtonsoft.Json.Linq; const string value = &qu ...
- Ajax--PHP+JQuery+Ajax解析json、XML数据、加载页面
一.JQuery+Ajax用get.post方式提交和请求数据 知识要点: $('#userName').blur(function () { var txt = $(this).val(); $.a ...
- iOS-数据持久化基础-JSON与XML数据解析
解析的基本概念 所谓“解析”:从事先规定好的格式串中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 一.X ...
- 玩转iOS开发 - JSON 和 Xml 数据解析
前言 Json 和xml是网络开发中经常使用的数据格式,JSON轻量级.xml相对较复杂.所以如今用JSON的比例很大.基本上从server获取的返回数据都是JSON格式的,作为iOS开发人员,解析J ...
- json和xml数据的解析
一 json数据 1一条json就像一个对象,也想像OC中的数组,且内嵌了很多键值对字典 {"name" : "jack", "age" : ...
- 请求json和xml数据时的方式
当请求xml数据时,直接通过NSMutableData接收后解析, NSURL *url = [NSURL URLWithString:PATH]; _receiveData = [[NSMutabl ...
- Python 导入CSV、JSON、XML数据
常见的机器可读格式包括: - 逗号分隔值(Comma-Separated Values,CSV)- 制表符分隔值(tab-separated values,TSV)- JavaScript 对象符号( ...
随机推荐
- Ecstore获取dbschema内容?
有时候在使用dbschema的时候,需要获取dbschema的结构.例如: 那么,我们可以这样写: 这样我就能获得 称呼 这个数组
- [c#]asp.net开发微信公众平台(1)数据库设计
开发微信公众平台之前,先去微信官方了解下大概的情况 这里:http://mp.weixin.qq.com/wiki/index.php :看了之后心里大致有数了,开始设计数据库,尽可能的考虑,未考虑到 ...
- 给控制器添加工具栏(Swift语言)
//懒加载工具条 private lazy var toolBar: UIToolbar = UIToolbar() //设置底部的工具条 private func setToolBar() { // ...
- html网页代码各种名称及作用
基本Web页文件<HTML><HEAD><TITLE></TITLE></HEAD><BODY></BODY>< ...
- startActivityForResult
Activity提供了startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity关闭后会向前面的Ac ...
- 学习笔记之AJAX无刷新分页
利用AJAX实现无刷新分页技术原理: 其主要是利用AJAX的异步处理机制,实现数据的异步传递,它隐藏了客户端向服务端请求数据的状态,在客户端表现为无刷新的显示状态. 实现分页的步骤: 1.客服端点击页 ...
- 移动端web页面使用position:fixed问题总结
近期完成了一个新的项目(搜狐直播),其中又涉及到了 fixed(固定位置定位)的问题,在之前的文章<移动Web产品前端开发口诀——“快”>中已经阐述过我对 iScroll 的态度,所以在这 ...
- PHPCMS v9 在windows2008系统 IIS7 下设置伪静态的方法
安装环境:windows2008+IIS7.0+PHP5+MYSQL5 一.安装phpcms v9程序,设置伪静态.如图: 二.安装IIS7官方Url重写模块 1.先到IIS官方下载模块 下载地址:h ...
- phpcms v9 数据库分离部署
v9数据模型功能,允许用户把不同的数据表,分离到不同的数据库服务器上.以实现负载的分离,更加的符合大访问网站的需求. <ignore_js_op> 数据分离方法 1.数据库连接配置配置文件 ...
- Mysql删除表名中有特殊字符的表
由于公司业务和应用的调整,之前在Mysql中的很多表都不需要了,故需要对数据库进行整理. 刚开始,我在想:不就删除一些表吗?很好解决,写个简单的脚本就可以了.我先看了数据库中有80000多个表,很 ...