Ext.data.reader.Json

JSON Reader是用一个代理来读取服务端响应的JSON格式的返回值. 一般用于将结果加载成一个存储集-例如我们将创建一些如下东西:

Ext.define('User', {
extend: 'Ext.data.Model',
fields: ['id', 'name', 'email']
}); var store = Ext.create('Ext.data.Store', {
model: 'User',
proxy: {
type: 'ajax',
url : 'users.json',
reader: {
type: 'json'
}
}
});

以上示例创建了一个“User”模型.

我们创建了尽可能最简单类型的JSON Reader对象, 简洁的告知了Store中的Proxy我们需要返回一个JSON Reader. Store将自动存储模型的配置,这样我们就可以通过以下方式来替代了:

reader: {
type : 'json',
model: 'User'
}

我们设置的reader属性已准备好从服务端读取数据了- 同时它将接受一个如下响应:

[
{
"id": 1,
"name": "Ed Spencer",
"email": "ed@sencha.com"
},
{
"id": 2,
"name": "Abe Elias",
"email": "abe@sencha.com"
}
]

读取其他JSON格式

如果你已经有了一份JSON格式的定义,且其看起来不是十分像以上我们提供的那些, 你仍然可以通过JsonReader的夫妻配置选项来使其可以解析你的格式. 例如,我们可以使用root配置来解析返回的如下数据:

{
"users": [
{
"id": 1,
"name": "Ed Spencer",
"email": "ed@sencha.com"
},
{
"id": 2,
"name": "Abe Elias",
"email": "abe@sencha.com"
}
]
}

为了解析这个,我们只要传递一个root配置匹配以上的“users”:

reader: {
type: 'json',
root: 'users'
}

有时候JSON的结构异常复杂. 像CouchDB的文档数据库经常围绕这样一个嵌套的结构内每个记录提供元数据:

{
"total": 122,
"offset": 0,
"users": [
{
"id": "ed-spencer-1",
"value": 1,
"user": {
"id": 1,
"name": "Ed Spencer",
"email": "ed@sencha.com"
}
}
]
}

以上示例中的记录数据是在"users"数组中嵌套的一个额外级别,其中的每个“user”项目中都包含有额外元数据(例如本例中的’id‘和‘value’). 为了解析以上json数据中的每个‘user’项中的数据, 需要特别指定record配置,如下所示:

reader: {
type : 'json',
root : 'users',
record: 'user'
}

响应的元数据

服务端可以在其响应中返回元数据,除了记录数据,其中数据本身的描述数据的属性集或用于重新配置的读取器。 为了在响应中获取元数据,需要给响应数据的根简明加上一个‘metaData’属性. 元数据属性可以包含任何东西, 但若Reader存在,其还支持的一个特定设置属性。:

  • root:
    响应中包含记录数据的节点对应的根属性名称
  • idProperty:
    数据中的主键字段属性名
  • totalProperty:
    数据中的所有记录数属性名
  • successProperty:
    响应中成功状态属性名
  • messageProperty:
    一个可选的响应信息的属性名
  • fields:
    在将响应数据转换成records之前用于重新配置Model的字段集的配置

一份Reader初始化的配置包含大概如下的这些属性 ("fields" 一般包含在Model的定义中,故这边不显示):

reader: {
type : 'json',
root : 'root',
idProperty : 'id',
totalProperty : 'total',
successProperty: 'success',
messageProperty: 'message'
}

若要得到一个响应对象包含一个不同于以上初始化中定义的属性,需要使用‘metaData’属性动态重配置Reader。 例如:

{
"count": 1,
"ok": true,
"msg": "Users found",
"users": [{
"userId": 123,
"name": "Ed Spencer",
"email": "ed@sencha.com"
}],
"metaData": {
"root": "users",
"idProperty": 'userId',
"totalProperty": 'count',
"successProperty": 'ok',
"messageProperty": 'msg'
}
}

你可以放置任何的你需要的任意数据在‘metaData’属性中,Reader将忽略这些属性, 但可以通过Reader的metaData属性(该属性也是通过监听Proxy'smetachange事件)。
(当然也可以由 store替代)。 然后,应用程序代码就可以选择任何的方式来处理获取到的元数据了。

如何使用这些来给Model定做合适的字段集的一个简单例子就是表格(grid)了。 通过传递‘fields’属性,Reader内部会自动更新Model,但这些变化不会自动反应在grid内部,除非你已更新了列配置项. 你可以手动执行这些,或者通过一个标准的grid配置对象column 作为‘metaData’属性,
然后就可以直接管理grid. 这有一个非常简单的例子说明如何实现这种情况:

// 响应格式:
{
...
"metaData": {
"fields": [
{ "name": "userId", "type": "int" },
{ "name": "name", "type": "string" },
{ "name": "birthday", "type": "date", "dateFormat": "Y-j-m" },
],
"columns": [
{ "text": "User ID", "dataIndex": "userId", "width": 40 },
{ "text": "User Name", "dataIndex": "name", "flex": 1 },
{ "text": "Birthday", "dataIndex": "birthday", "flex": 1, "format": 'Y-j-m', "xtype": "datecolumn" }
]
}
}

Reader可以自动读取meta字段集的配置,并根据新的字段集重建Model, 但要处理新的列配置,需要在应用程序代码中处理元数据。 处理元数据时间可以很简单的通过store或proxy,例如:

    var store = Ext.create('Ext.data.Store', {
...
listeners: {
'metachange': function(store, meta) {
myGrid.reconfigure(store, meta.columns);
}
}
});

Ext.data.reader.Xml

XML Reader 用于代理读取服务端返回的XML格式的响应. 这一般发生在加载Store的结果上 - 例如如下我们创建一个类似的:

Ext.define('User', {
extend: 'Ext.data.Model',
fields: ['id', 'name', 'email']
}); var store = Ext.create('Ext.data.Store', {
model: 'User',
proxy: {
type: 'ajax',
url : 'users.xml',
reader: {
type: 'xml',
record: 'user',
root: 'users'
}
}
});

以上例子创建了一个'User'模型. 若不熟悉模型,可参阅Model文档,有详细的解释说明

尽可能以简单的方式告知Store的{@linkExt.data.proxy.Proxy
Proxy} 我们需要一个XML Reader来创建一个极简单的XML类型的Reader, Store将自动传递模型的参数给Store 所以我们可以如下方式传递参数代替:

reader: {
type : 'xml',
model: 'User',
record: 'user',
root: 'users'
}

以上我们设置好的reader已准备好从服务端读取数据 - 在这时,reader会接收到一个如下响应:

<?xml version="1.0" encoding="UTF-8"?>
<users>
<user>
<id>1</id>
<name>Ed Spencer</name>
<email>ed@sencha.com</email>
</user>
<user>
<id>2</id>
<name>Abe Elias</name>
<email>abe@sencha.com</email>
</user>
</users>

首先root 选项用于定义根节点<users> (一个完善的XML文档必须只有一个根).
然后XML Reader使用配置项record将数据拉成每个记录 -
在本例中,我们设置记录为‘user’, 所以以上的每个<user>都会转化成User模型中的对象.

注意:XmlReader不关心根节点root 和 record 元素是否嵌套在一个更大的结构内,
所以如下的响应数据,仍然是可以有效工作的:

<?xml version="1.0" encoding="UTF-8"?>
<deeply>
<nested>
<xml>
<users>
<user>
<id>1</id>
<name>Ed Spencer</name>
<email>ed@sencha.com</email>
</user>
<user>
<id>2</id>
<name>Abe Elias</name>
<email>abe@sencha.com</email>
</user>
</users>
</xml>
</nested>
</deeply>

响应的元数据

服务器可以在响应中返回额外的数据, 例如 记录集数 和 响应成功状态.
它们一般是如下这般包含在XML的响应中:

<?xml version="1.0" encoding="UTF-8"?>
<users>
<total>100</total>
<success>true</success>
<user>
<id>1</id>
<name>Ed Spencer</name>
<email>ed@sencha.com</email>
</user>
<user>
<id>2</id>
<name>Abe Elias</name>
<email>abe@sencha.com</email>
</user>
</users>

如果这些属性都存在于XML的响应中,他们可以被XmlReader解析到和加载它的Store使用。 我们可以由指定的最后一对配置项来设立这些属性的名称:

reader: {
type: 'xml',
root: 'users',
totalProperty : 'total',
successProperty: 'success'
}

这些最后的配置项对于创建Reader工作不是必需的,但也可以是有用的。 当服务端需要报告一个错误,或者用于表明有大量数据可用, 其中正在返回的只有一个子集。

响应格式

注意: 为了浏览器能解析返回的XML文档, HTTP响应中的Content-Type header必须设为"text/xml" 或"application/xml"。 这点非常重要 - 否则XmlReader将无法正常工作


ExtJs4学习(九)读写器reader、writer的更多相关文章

  1. RFID 读写器 Reader Writer Cloner

    RFID读写器的工作原理 RFID的数据采集以读写器为主导,RFID读写器是一种通过无线通信,实现对标签识别和内存数据的读出和写入操作的装置. 读写器又称为阅读器或读头(Reader).查询器(Int ...

  2. C#中流的读写器BinaryReader、BinaryWriter,StreamReader、StreamWriter详解【转】

    https://blog.csdn.net/ymnl_gsh/article/details/80723050 C#的FileStream类提供了最原始的字节级上的文件读写功能,但我们习惯于对字符串操 ...

  3. Java I/O(三)各种Reader和Writer读写器、RandomAccessFile随机访问文件、序列化

    2019 01/01 八.Reader和Writer读写器 前面讲的输入输出流的基本单位都是字节,因此可以称为“字节流”,读写器是以字符为基本单位,可以称为“字符流”.它们的使用方法非常相似,因此我考 ...

  4. ExtJS4.2学习(7)——基础知识之Reader&Writer篇

    Reader: 主要用于将proxy数据代理读取的数据按照不同的规则进行解析,将解析好的数据保存到Modle中. 结构图 Ext.data.reader.Reader 读取器的根类(很少直接实例化这个 ...

  5. 【转】九步学习python装饰器

    本篇日志来自:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 纯转,只字未改.只是为了学习一下装饰器.其实现在也是没有太看明白 ...

  6. Extjs4学习

    1 Ext js初步 1.1 获取Extjs 下载extjs: 可以从http://extjs.org.cn/ 获得需要的extjs发布包及更多支持. 1.2 搭建学习环境: 假设您的机器已经安装my ...

  7. Stream,Reader/Writer,Buffered的区别(1)

    Stream: 是字节流形式,exe文件,图片,视频等.支持8位的字符,用于 ASCII 字符和二进制数据. Reader/Writer: 是字符流,文本文件,XML,txt等,用于16位字符,也就是 ...

  8. RFIDler - An open source Software Defined RFID Reader/Writer/Emulator

    https://www.kickstarter.com/projects/1708444109/rfidler-a-software-defined-rfid-reader-writer-emul h ...

  9. Windows核心编程学习九:利用内核对象进行线程同步

    注:源码为学习<Windows核心编程>的一些尝试,非原创.若能有助于一二访客,幸甚. 1.程序框架 #include "Queue.h" #include <t ...

随机推荐

  1. python基础之字典、集合

    一.字典(dictionary) 作用:存多个值,key-value存取,取值速度快 定义:key必须是不可变类型,value可以是任意类型 字典是一个无序的,可以修改的,元素呈键值对的形式,以逗号分 ...

  2. KEIL中查看程序存储空间的大小

    Program Size: Code=86496 RO-data=9064 RW-data=1452 ZI-data=16116 Code是代码占用的空间,RO-data是 Read Only 只读常 ...

  3. MyBatis 开启 Log4j 日志调试信息开关

    Log4j 是什么 Log4j 是由 Apache 提供的开源日志框架,用于帮助用户处理日志信息. Log4j 能将日志信息分级打印和存储,而且提供了日志不同的存储方式,我们可以将日志发送到控制台,或 ...

  4. MongoDB(12)- 查询嵌入文档的数组

    插入测试数据 db.inventory.insertMany( [ { item: "journal", instock: [ { warehouse: "A" ...

  5. ISP算法高水平分析(下)

    ISP算法高水平分析(下)  十.LSC(Lens Shade Correction)------镜头阴影矫正 Lens Shading指画面四角由于入射光线不足形成的暗角,同时,由于不同频率的光折射 ...

  6. 3D点云几何拟合

    3D点云几何拟合 Supervised Fitting of Geometric Primitives to 3D Point Clouds 论文地址: http://openaccess.thecv ...

  7. WebRTC框架中的硬件加速

    WebRTC框架中的硬件加速 典型缓冲流量 应用程序和单元测试设置 重要方法调用 WebRTC软件包 局限性 WebRTC是一个免费的开源项目,可为浏览器和移动应用程序提供实时通信功能. WebRTC ...

  8. ARM系列处理器和架构

    从一只ARM到另一只ARM! ARM处理器和架构 当前可用的处理器 ARM1 ARM2 ARM3 ARM4和5 ARM6 ARM7 ARM8 强壮有力的ARM ARM9 ARM10 ARM架构 v1  ...

  9. .Net RabbitMQ实战指南——HTTP API接口调用

    RabbitMQ Management插件还提供了基于RESTful风格的HTTP API接口来方便调用.一共涉及4种HTTP方法:GET.PUT.DELETE和POST.GET方法一般用来获取如集群 ...

  10. 利用ServletContext,实现Session动态权限变更

    1.前言 很多Spring Boot应用使用了Session作为缓存,一般会在用户登录后保存用户的关键信息,如: 用户ID. 用户名. 用户token. 权限角色集合. 等等... 在管理员修改了用户 ...