Ext.data.reader.Json

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

  1. Ext.define('User', {
  2. extend: 'Ext.data.Model',
  3. fields: ['id', 'name', 'email']
  4. });
  5. var store = Ext.create('Ext.data.Store', {
  6. model: 'User',
  7. proxy: {
  8. type: 'ajax',
  9. url : 'users.json',
  10. reader: {
  11. type: 'json'
  12. }
  13. }
  14. });

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

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

  1. reader: {
  2. type : 'json',
  3. model: 'User'
  4. }

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

  1. [
  2. {
  3. "id": 1,
  4. "name": "Ed Spencer",
  5. "email": "ed@sencha.com"
  6. },
  7. {
  8. "id": 2,
  9. "name": "Abe Elias",
  10. "email": "abe@sencha.com"
  11. }
  12. ]

读取其他JSON格式

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

  1. {
  2. "users": [
  3. {
  4. "id": 1,
  5. "name": "Ed Spencer",
  6. "email": "ed@sencha.com"
  7. },
  8. {
  9. "id": 2,
  10. "name": "Abe Elias",
  11. "email": "abe@sencha.com"
  12. }
  13. ]
  14. }

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

  1. reader: {
  2. type: 'json',
  3. root: 'users'
  4. }

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

  1. {
  2. "total": 122,
  3. "offset": 0,
  4. "users": [
  5. {
  6. "id": "ed-spencer-1",
  7. "value": 1,
  8. "user": {
  9. "id": 1,
  10. "name": "Ed Spencer",
  11. "email": "ed@sencha.com"
  12. }
  13. }
  14. ]
  15. }

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

  1. reader: {
  2. type : 'json',
  3. root : 'users',
  4. record: 'user'
  5. }

响应的元数据

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

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

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

  1. reader: {
  2. type : 'json',
  3. root : 'root',
  4. idProperty : 'id',
  5. totalProperty : 'total',
  6. successProperty: 'success',
  7. messageProperty: 'message'
  8. }

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

  1. {
  2. "count": 1,
  3. "ok": true,
  4. "msg": "Users found",
  5. "users": [{
  6. "userId": 123,
  7. "name": "Ed Spencer",
  8. "email": "ed@sencha.com"
  9. }],
  10. "metaData": {
  11. "root": "users",
  12. "idProperty": 'userId',
  13. "totalProperty": 'count',
  14. "successProperty": 'ok',
  15. "messageProperty": 'msg'
  16. }
  17. }

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

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

  1. // 响应格式:
  2. {
  3. ...
  4. "metaData": {
  5. "fields": [
  6. { "name": "userId", "type": "int" },
  7. { "name": "name", "type": "string" },
  8. { "name": "birthday", "type": "date", "dateFormat": "Y-j-m" },
  9. ],
  10. "columns": [
  11. { "text": "User ID", "dataIndex": "userId", "width": 40 },
  12. { "text": "User Name", "dataIndex": "name", "flex": 1 },
  13. { "text": "Birthday", "dataIndex": "birthday", "flex": 1, "format": 'Y-j-m', "xtype": "datecolumn" }
  14. ]
  15. }
  16. }

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

  1. var store = Ext.create('Ext.data.Store', {
  2. ...
  3. listeners: {
  4. 'metachange': function(store, meta) {
  5. myGrid.reconfigure(store, meta.columns);
  6. }
  7. }
  8. });

Ext.data.reader.Xml

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

  1. Ext.define('User', {
  2. extend: 'Ext.data.Model',
  3. fields: ['id', 'name', 'email']
  4. });
  5. var store = Ext.create('Ext.data.Store', {
  6. model: 'User',
  7. proxy: {
  8. type: 'ajax',
  9. url : 'users.xml',
  10. reader: {
  11. type: 'xml',
  12. record: 'user',
  13. root: 'users'
  14. }
  15. }
  16. });

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

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

  1. reader: {
  2. type : 'xml',
  3. model: 'User',
  4. record: 'user',
  5. root: 'users'
  6. }

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <users>
  3. <user>
  4. <id>1</id>
  5. <name>Ed Spencer</name>
  6. <email>ed@sencha.com</email>
  7. </user>
  8. <user>
  9. <id>2</id>
  10. <name>Abe Elias</name>
  11. <email>abe@sencha.com</email>
  12. </user>
  13. </users>

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

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <deeply>
  3. <nested>
  4. <xml>
  5. <users>
  6. <user>
  7. <id>1</id>
  8. <name>Ed Spencer</name>
  9. <email>ed@sencha.com</email>
  10. </user>
  11. <user>
  12. <id>2</id>
  13. <name>Abe Elias</name>
  14. <email>abe@sencha.com</email>
  15. </user>
  16. </users>
  17. </xml>
  18. </nested>
  19. </deeply>

响应的元数据

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <users>
  3. <total>100</total>
  4. <success>true</success>
  5. <user>
  6. <id>1</id>
  7. <name>Ed Spencer</name>
  8. <email>ed@sencha.com</email>
  9. </user>
  10. <user>
  11. <id>2</id>
  12. <name>Abe Elias</name>
  13. <email>abe@sencha.com</email>
  14. </user>
  15. </users>

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

  1. reader: {
  2. type: 'xml',
  3. root: 'users',
  4. totalProperty : 'total',
  5. successProperty: 'success'
  6. }

这些最后的配置项对于创建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基础之常用模块一(sys、greenlet、pymysql、paramiko、pexpect、configparser)

    一.sys模块(内置模块) 用于提供对解释器相关的操作 import syssys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) ...

  2. MindSpore激活函数总结与测试

    技术背景 激活函数在机器学习的前向网络中担任着非常重要的角色,我们可以认为它是一个决策函数.举个例子说,我们要判断一个输出的数据是猫还是狗,我们所得到的数据是0.01,而我们预设的数据中0代表猫1代表 ...

  3. 多尺度目标检测 Multiscale Object Detection

    多尺度目标检测 Multiscale Object Detection 我们在输入图像的每个像素上生成多个锚框.这些定位框用于对输入图像的不同区域进行采样.但是,如果锚定框是以图像的每个像素为中心生成 ...

  4. Kettle通过Http post请求webservice接口以及结果解析处理

    kettle中有两种方式请求webservice服务,一个是Web服务查询,但是这个有缺陷,无法处理复杂的需求,遇到这种情况就需要用Http post来处理了. 网上也有很多关于Http post请求 ...

  5. 深入理解java虚拟机笔记Chapter12

    (本节笔记的线程收录在线程/并发相关的笔记中,未在此处提及) Java内存模型 Java 内存模型主要由以下三部分构成:1 个主内存.n 个线程.n 个工作内存(与线程一一对应) 主内存与工作内存 J ...

  6. 【NX二次开发】Block UI 对象颜色选择器

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...

  7. 排查bug:竟然是同事把Redis用成这鬼样子,坑了我

    首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,所有api无响应现象 刚开始当测试抱怨环境响应慢的时候 ,我们重启一下应用,应用恢复正常,于是没做处理.但是后来问题出现频率越来越频 ...

  8. HTTP首部字段详解

    HTTP首部字段详解 在HTTP/1.1规范中定义了47种首部字段,总共分为四大类: 通用首部字段 -- 请求报文和响应报文两方都会使用的首部 请求首部字段 -- 从客户端向服务器端发送请求报文时使用 ...

  9. 详解 CDN 加速

    背景 本来是为了深入了解 CDN 的,结果发现前置知识:IP.域名.DNS 都还不算特别熟,所以先写了他们 现在终于来聊一聊 CDN 啦 本文素材均出自:https://www.bilibili.co ...

  10. 在js中使用moment将秒转换为多少天多少小时多少分多少秒

    let x = 2703750;//单位是秒 var d = moment.duration(x, 'seconds'); console.log(Math.floor(d.asDays()) + ' ...