`
zhouyrt
  • 浏览: 1141693 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

读Ext之十(解析JSON)

阅读更多

首先,回到第一篇 。使用Ext.apply为Ext对象添加了一些属性,

 

Ext.apply(Ext, {
	...
    USE_NATIVE_JSON : false,       
    ...      
});

 

USE_NATIVE_JSON 即为其中之一, 可以使用它来设置是否开启浏览器原始的JSON(即JSON.parse,JSON.stringify)来 解析 或反解析。这是ECMA5 中加入的,在 字符串转换成json的三种方式 中已经提到。

该值初始为false,即不开启。设置为true则开启如

Ext.USE_NATIVE_JSON = true;

Ext.util.JSON 内部定义了一些私有方法,对外公开的有三个方法

encodeDate 将日期对象转成字符串
encode     将JS对象转成字符串
decode     将字符串转成JS对象

此外,encode和decode分别赋值给了Ext.encode和Ext.decode。如

 

Ext.encode = Ext.util.JSON.encode;
Ext.decode = Ext.util.JSON.decode;

 

即开发时可以使用更简短的Ext.encode和Ext.decode而非冗长的Ext.util.JSON.encode和Ext.util.JSON.decode。

Ext.util.JSON的大体结构如下

 

Ext.util.JSON = new (function(){
    var useHasOwn = !!{}.hasOwnProperty,
        isNative = function() {
            var useNative = null;

            return function() {
                if (useNative === null) {
                    useNative = Ext.USE_NATIVE_JSON && window.JSON && JSON.toString() == '[object JSON]';
                }
        
                return useNative;
            };
        }(),
		...
		;

    this.encodeDate = function(o){
    };
    this.encode = function() {

    }();
    this.decode = function() {

    }();

})();

 

可看到new了一个匿名函数(类),即Ext.util.JSON为一个单体。

匿名类中定义了一些私有变量useHasOwn、isNative等,this上挂了三个方法,即上面提到的对外公开的三个接口方法。

isNative 函数用来判断是否开启浏览器原始解析JSON的API,当然该函数只在Ext.USE_NATIVE_JSON为true的时候起作用,否则永远使用私有的doDecode和doEncode来解析。

 

isNative = function() {
    var useNative = null;
    return function() {
        if (useNative === null) {
            useNative = Ext.USE_NATIVE_JSON && window.JSON && JSON.toString() == '[object JSON]';
        }
        return useNative;
    };
}(),
 

pad 函数用来计算日期,所传参数n小于10时添加个0, 如月份传3时返回03,自动补个0。 this.encodeDate方法中用到。

 

pad = function(n) {
    return n < 10 ? "0" + n : n;
},

 

doDecode 函数将字符转成JS对象,这里采用eval方式,当然还可以使用new Function。

 

doDecode = function(json){
    return eval("(" + json + ')');    
},
 

别忘了eval中两旁的小括号,否则会有意想不到的bug。为何加小括号见:javascript中大括号“{}”的多义性


doEncode 函数将JS对象转换成符合JSON规范的字符串,这个函数比较复杂。先对基本类型和数组,日期进行转换,最后是对JS对象的处理。

doEncode = function(o){
    if(!Ext.isDefined(o) || o === null){
        return "null";
    }else if(Ext.isArray(o)){
        return encodeArray(o);
    }else if(Ext.isDate(o)){
        return Ext.util.JSON.encodeDate(o);
    }else if(Ext.isString(o)){
        return encodeString(o);
    }else if(typeof o == "number"){
        //don't use isNumber here, since finite checks happen inside isNumber
        return isFinite(o) ? String(o) : "null";
    }else if(Ext.isBoolean(o)){
        return String(o);
    }else {
        var a = ["{"], b, i, v;
        for (i in o) {
            // don't encode DOM objects
            if(!o.getElementsByTagName){
                if(!useHasOwn || o.hasOwnProperty(i)) {
                    v = o[i];
                    switch (typeof v) {
                    case "undefined":
                    case "function":
                    case "unknown":
                        break;
                    default:
                        if(b){
                            a.push(',');
                        }
                        a.push(doEncode(i), ":",
                                v === null ? "null" : doEncode(v));
                        b = true;
                    }
                }
            }
        }
        a.push("}");
        return a.join("");
    }    
},
 

doEncode中对字符串的转换用到了encodeString及encodeArray函数。

最后是三个挂在this上的方法,以this.decode示例

 

this.decode = function() {
    var dc;
    return function(json) {
        if (!dc) {
            // setup decoding function on first access
            dc = isNative() ? JSON.parse : doDecode;
        }
        return dc(json);
    };
}();
 

 

dc = isNative() ? JSON.parse : doDecode 可以看到如果isNative()返回true则使用浏览器原始的JSON.parse,否则使用doDecode。

 

7
1
分享到:
评论

相关推荐

    Ext 中JsonLib 解析字符串

    Ext 中JsonLib 解析字符串 Ext 中JsonLib 解析字符串 Ext 中JsonLib 解析字符串

    ext-grid+json简单应用

    在JSON方面,它是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Web开发中,JSON常用于服务器向客户端传递数据。 首先,我们需要设置Grid的基本结构,包括定义列(columns)和配置...

    oracle-plsql解析json

    例如,`json_parser.sql`可能包含了解析JSON字符串的代码,`json_ext.sql`可能扩展了JSON处理的能力,`json_printer.sql`可能用于打印或格式化JSON数据,而`json_ac.sql`可能涉及到访问控制或安全相关的功能。...

    EXT实例+JSON

    EXT会自动将JSON数据解析成数据模型实例,并填充到数据存储中。 5. **绑定数据**:EXT的组件可以直接与数据存储绑定,当数据改变时,组件会自动更新。例如,将数据存储绑定到`Ext.grid.Panel`,数据就会自动显示在...

    EXT JSON Sqlserver 分页 全部正常运行

    JSON格式数据易于解析,可以快速地在JavaScript对象和字符串之间转换,使得前后端数据交换变得简单高效。 3. SQL Server与数据库操作:SQL Server是微软开发的关系型数据库管理系统,支持各种复杂的SQL查询和事务...

    ext tree json 例子(不含EXT包)

    "ext tree json 例子(不含EXT包)"这个标题暗示我们将讨论如何在不直接引用EXT完整包的情况下,仅使用EXT JS中关于TreePanel和JSON解析的部分来构建一个动态的树形结构。这可能涉及到手动引入EXT的核心组件,如...

    ext树 无限级 json 数据格式 动态加载

    务必注意,JSON数据的格式必须与EXT TreeStore的reader配置匹配,否则可能导致数据解析错误。 在提供的文件`tree`中,可能包含了EXT树实现上述功能的示例代码,可以参考和学习以加深理解。总的来说,EXT树的无限级...

    JSON.rar_JSON Hibernate_extjs_json struts ext_jsp json extjs_str

    在给定的标题"JSON.rar_JSON Hibernate_extjs_json struts ext_jsp json extjs_str"中,我们可以看出这是一个与JSON相关的项目,可能包含了使用JSON进行数据交换的各种技术集成。JSON在这里可能是作为前后端数据传输...

    Ext.tree.TreeLoader附带封装的json类

    `Ext.tree.TreeLoader`是Ext JS库中的一个组件,它负责加载和解析树形结构的数据,而JSON(JavaScript Object Notation)则是一种轻量级的数据交换格式,非常适合于在服务器和客户端之间传输数据。我们将通过实例...

    Ext4+JSON+Servlet+Tree构建Web应用框架

    在构建Web应用框架时,"Ext4+JSON+Servlet+Struts2+Ext.tree.Panel+Ext.tab.Panel"的组合提供了一种高效且功能丰富的解决方案。这个框架的核心组件包括Ext4 JavaScript库、JSON数据交换格式、Servlet或Struts2作为...

    ext json请求java后台返回集合数据

    - 前端EXTJS Grid接收到响应后,自动解析JSON数据,并填充到Grid中展示。 以上就是关于EXTJS通过JSON请求Java后台并返回集合数据的基本流程和涉及的关键点。在实际开发中,还需要考虑错误处理、安全性、性能优化等...

    ext grid json分页显示

    4. 后端返回JSON数据到前端,EXT Grid解析JSON,渲染新的数据行,并更新分页状态。 5. 这样,用户就能看到动态加载的分页数据,而无需手动刷新整个页面。 标签"Ajax"强调了这种异步数据交互的方式。Ajax技术的核心...

    ext json struts 完整无错源码

    EXT 接收到 JSON 数据后,会自动解析并更新 UI 组件的状态。这种前后端分离的方式提高了应用的可维护性和可扩展性。 EXT 框架的核心组成部分包括: 1. **EXT JS**: 这是前端的核心库,包含了大量的组件、布局和...

    Ext+json,+jquery培训资料

    - JSON的优势在于其紧凑的格式,减少了网络传输的数据量,同时被多种编程语言支持,如JavaScript可以直接使用`eval()`解析JSON数据。 3. **Ajax中的XML与JSON比较**: - XML作为数据交换格式,具有结构化和标准化...

    Ext tree json Demo

    4. **Ajax请求和数据解析**:利用`Ext.Ajax.request`发送异步请求,获取JSON数据后,使用`Ext.decode`将JSON字符串解析为JavaScript对象。 5. **树节点的渲染和交互**:配置`uiProviders`和`renderer`函数,自定义...

    Ext 根据数据库返回json动态生成grid列表实例

    这个过程包括了Grid的基本配置、数据存储的设定以及如何处理和解析服务器返回的JSON数据。这种灵活性使得ExtJS Grid成为一个强大且可扩展的数据展示工具,可以根据不同的数据结构自适应地调整显示方式。通过实践这个...

    struts2与Ext4.0的json交互

    总结来说,Struts2与Ext4.0的JSON交互涉及Struts2的JSON插件配置、Action类的JSON返回、以及Ext4.0的Ajax请求和JSON解析。这种交互方式极大地提高了Web应用的用户体验,因为可以通过异步方式更新页面,而无需每次都...

    使用html标签、jQuery-EasyUI和Ext4分别展示json数据的效果

    EasyUI会自动解析JSON数据并填充到表格中,同时提供排序、筛选等交互功能。 最后,我们来看Ext4,这是一个功能强大的JavaScript框架,专门用于构建富客户端应用程序。在Ext4中,你可以使用`Ext.data.Store`和`Ext....

    PL/JSON(json_v1_0_4及中文文档)

    例如,"json_parser.sql"可能是用来解析JSON字符串的代码,"json_ext.sql"可能包含了扩展功能,"json_printer.sql"可能用于将JSON对象转换成易于阅读的格式,而"json_ac.sql"可能涉及到访问控制或权限管理相关的功能...

Global site tag (gtag.js) - Google Analytics