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-jsonhttps://github.com/ereilin/qt-json (需要将文件加入Project)

http://www.developer.nokia.com/Community/Wiki/%E5%9C%A8Qt%E4%B8%AD%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87QJson_%E8%A7%A3%E6%9E%90json%E6%95%B0%E6%8D%AE

---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数据的更多相关文章

  1. iOS开发——网络Swift篇&JSON与XML数据解析

    JSON与XML数据解析 JSON数据解析(内置NSJSONSerialization与第三方JSONKit)   一,使用自带的NSJSONSerialization 苹果从IOS5.0后推出了SD ...

  2. php生成json或者xml数据

    , ,'数据返回成功',$arr);echo $xml;?>

  3. C#解析json和xml数据

    C#解析json和xml数据 // 用到的包using Newtonsoft.Json; // using Newtonsoft.Json.Linq; const string value = &qu ...

  4. Ajax--PHP+JQuery+Ajax解析json、XML数据、加载页面

    一.JQuery+Ajax用get.post方式提交和请求数据 知识要点: $('#userName').blur(function () { var txt = $(this).val(); $.a ...

  5. iOS-数据持久化基础-JSON与XML数据解析

    解析的基本概念 所谓“解析”:从事先规定好的格式串中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 一.X ...

  6. 玩转iOS开发 - JSON 和 Xml 数据解析

    前言 Json 和xml是网络开发中经常使用的数据格式,JSON轻量级.xml相对较复杂.所以如今用JSON的比例很大.基本上从server获取的返回数据都是JSON格式的,作为iOS开发人员,解析J ...

  7. json和xml数据的解析

    一 json数据 1一条json就像一个对象,也想像OC中的数组,且内嵌了很多键值对字典 {"name" : "jack", "age" : ...

  8. 请求json和xml数据时的方式

    当请求xml数据时,直接通过NSMutableData接收后解析, NSURL *url = [NSURL URLWithString:PATH]; _receiveData = [[NSMutabl ...

  9. Python 导入CSV、JSON、XML数据

    常见的机器可读格式包括: - 逗号分隔值(Comma-Separated Values,CSV)- 制表符分隔值(tab-separated values,TSV)- JavaScript 对象符号( ...

随机推荐

  1. ListIterator add remove 使用注意

    add方法示例 //在最前面添加 List<String> list1 = new LinkedList<String>(Arrays.asList(new String[]  ...

  2. 重学《C#高级编程》(对象与类型)

    昨天重看了下<C#高级编程>里面的对象与类型一章,发现自己有许多遗漏没懂的地方重新弄清楚明白了 先说说什么是对象吧,我个人的感觉是:在编程的世界里,一段程序就是一个事物的处理逻辑,而对象就 ...

  3. LINQ Enumerable

    System.Linq.Enumerable类,提供了数十种称为扩展方法的共享方法,帮助您操作所有实现IEnumerable(of T)接口的类中的数据.由于Enumerable类的扩展方法可以处理许 ...

  4. QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码

    OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容. QQ登录OAuth2 ...

  5. sping注解原理

    持续更新中.. spring注解用的是java注解,用到的是java反射机制. 参考文档如下: http://zxf-noimp.iteye.com/blog/1071765 对应spring源码如下 ...

  6. Ecstore关于finder的默认的参数row的数据不见了的一些小问题?

    在finder中,我们经常对默认的参数row进行数据的编辑处理,然而,在实际处理中,会遇到这么一个问题,该处理的数据不见了,造成这一原因的重要原 因是因为在设置的时候,把某些字段屏蔽掉了,导致返回的r ...

  7. Php 基本语法

    php基本语法 1. 四种不同的开始结束标记 只有<?php ?>.<script language="php"></script>两个总是可用 ...

  8. CodedDFS日志配置

    本文根据Log4j的配置属性,编写了用于记录BMBR编码的日志 author: zyumeng Blog: [url] http://www.cnblogs.com/zyumeng/ [/url] 利 ...

  9. eclipse下编译openfire3.9.1源码

    [一].下载源码 打开网址:http://www.igniterealtime.org/downloads/source.jsp 选择目前最新版本 openfire_src_3_9_1.zip 下载. ...

  10. PHP学习系列(1)——字符串处理函数(4)

    16.hebrevc() 函数把希伯来文本从右至左的流转换为左至右的流.它也会把新行 (\n) 转换为 <br />.只有 224 至 251 之间的 ASCII 字符,以及标点符号受到影 ...