`
decentway
  • 浏览: 160655 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

YUI 3 : json

阅读更多

    JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

JSON模块综述:

为了是脚本尽可能的小,JSON模块被分成了以下几个部分:

 json-parse,json-stringify,json

 

   json-parse:解析JSON字符串。

   json-stringify:将js对象转化为JSON字符串。

   json:同时实现以上两者。

 

解析JSON字符串到本地JS值

YUI().use('json-parse', function (Y) {

var jsonString = '{"products":['+
    '{"id":1,"price":0.99,"inStock":true,"name":"grapes"},'+
    '{"id":2,"price":3.5,"inStock":false,"name":"passion fruit"},'+
    '{"id":3,"price":2.5,"inStock":true,"name":"bananas"}'+
']}';

// JSON.parse 当jsonString为无效的JSON值时,要捕获错误。
try {
    var data = Y.JSON.parse(jsonString);
}
catch (e) {
    alert("Invalid product data");
}

//使用JSON值。
for (var i = data.products.length - 1; i >= 0; --i) {
    var p = data.products[i];
    if (p.price < 1) {
        p.price += 1; // Price increase!
    }
}

});
 

使用可选的“reviver ”参数:

注意名值对:key——var

这个可选的第二个参数,如果返回reviver的值是没有定义,那么这个key将被忽略。

YUI().use('json-parse', function (Y) {

    var jsonString = '{"products":['+
        '{"id":1,"price":0.99,"inStock":true,"name":"grapes"},'+
        '{"id":2,"price":3.5,"inStock":false,"name":"passion fruit"},'+
        '{"id":3,"price":2.5,"inStock":true,"name":"bananas"}'+
    ']}';

    // 移除所有没有库存,name为 bananas的条目,以及格式化price。
    var currencySymbol = '$';
    var reviver = function (key,val) {
        if (key === 'inStock' && !val) {
            return undefined;
        } else if (val === 'bananas') {
            return undefined;
        } else if (key === 'price') {
            val += val % 1 ? "0" : ".00";
            var pIdx = val.indexOf('.');
            val = pIdx ? "0" + val : val;
            val = currencySymbol + val.substr(0,pIdx + 3);
        }

        return val;
    };

    // 如果是无效的JSON,将抛出一个异常。
    try {
        var data = Y.JSON.parse(jsonString,reviver);
    }
    catch (e) {
        alert("Invalid product data");
    }

    // 使用处理过的数据。
    alert(data.products.length); // 1
    alert(data.products[0].price); // $0.99

});
 

不使用 eval:

eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

参见:http://www.w3school.com.cn/js/jsref_eval.asp

使用JSON模块的parse方法将更加安全:

// 不安全
var data = eval('(' + shouldBeJsonData + ')');

// 安全
var data = Y.JSON.parse(shouldBeJsonData);
 

从JS对象中创建JSON字符串

为了把JS对象(或者是任何一个允许的值)转换为一个JSON字符串,传递对象到Y.JSON.stringify并且捕获返回值。

YUI().use("json-stringify", function (Y) {

    var myData = {
        troop : [
            { name: "Ashley", age: 12 },
            { name: "Abby", age:9 }
        ]
    }; 

    var jsonStr = Y.JSON.stringify(myData);

    alert(jsonStr); // {"troop":[{"name":"Ashley","age":12},{"name":"Abby","age":9}]}
});
 

使用一个白名单:

为了仅序列号一个固定的名的子集,该函数提供了一个key名数组作为stringify的第二个参数。

YUI().use("json-stringify", function (Y) {

    var myData = {
        troop : [
            { name: "Ashley", age: 12 },
            { name: "Abby", age:9 }
        ]
    }; 

    var jsonStr = Y.JSON.stringify(myData);

    alert(jsonStr); // {"troop":[{"name":"Ashley","age":12},{"name":"Abby","age":9}]}
});YUI().use("json-stringify", function (Y) {

    // 对象记录集
    var records = [
        {id:1, name: "Bob",   age: 47, favorite_color: "blue"},
        {id:2, name: "Sally", age: 30, favorite_color: "mauve"},
        {id:3, name: "Tommy", age: 13, favorite_color: "black"},
        {id:4, name: "Chaz",  age: 26, favorite_color: "plaid"}
    ];

    // 创建一个字符才仅仅包含id和age;
    var jsonStr = Y.JSON.stringify(records,["id","age"]);

    alert(jsonStr);
    // [{"id":1,"age":47},{"id":2,"age":30},{"id":3,"age":13},{"id":4,"age":26}]

}); 

 

使用一个自定义的”replacer“:

 

YUI().use("json-stringify", function (Y) {

    // 记录集
    var records = [
        {id:1, name: "Bob",   birthdate: "2/27/1964", favorite_color: "blue"},
        {id:2, name: "Sally", birthdate: "9/30/1983", favorite_color: "mauve"},
        {id:3, name: "Tommy", birthdate: "3/11/1990", favorite_color: "black"},
        {id:4, name: "Chaz",  birthdate: "5/22/1975", favorite_color: "plaid"}
    ];

    // 将id 和 favorite_color加入黑名单,将生日转换成为UTC格式。
    var replacer = function (key,val) {
        // 将id 和 favorite_color加入黑名单
        if (key === 'id' || key === 'favorite_color') {
            return undefined;

        // 将生日转换成为UTC格式。
        } else if (key === 'birthdate') {
            var d = new Date(),
                bd = val.split('/');
            d.setFullYear(bd[2],bd[0]-1,bd[1]);
            d.setHours(0,0,0);
            return d;
        }

        return val;
    };

    var jsonStr = Y.JSON.stringify(records,replacer);

    alert(jsonStr);
    // [{"name":"Bobby","birthdate":"1964-02-28T08:00:00Z"},{"name":"Sally","birthdate":"1983-09-30T07:00:00Z"},{"name":"Tommy","birthdate":"1990-03-11T08:00:00Z"},{"name":"Chaz","birthdate":"1975-05-23T07:00:00Z"}]

});
 

 

格式化JSON输出:

 

YUI().use('json-stringify', function (Y) {

    var fam = {
        family: "Franklin",
        children: [ "Bob", "Emily", "Sam" ]
    };

    //格式化:用四个空格。
    var jsonStr = Y.JSON.stringify(fam,null,4);

    alert(jsonStr);
    /*
    {
        "family": "Franklin",
        "children": [
            "Bob",
            "Emily",
            "Sam"
        ]
    }
    */

});
 

 

捕获JSON错误

同parse,stringify也需要捕获错误。

循环引用?

 

try {
    // BOOM
    Y.JSON.parse("{'this string': is, not_valid: ['J','S','O','N'] }");
}
catch (e) {
    alert("A string may eval to the same object, but might not be valid JSON");
}

// This is safe to stringify
var myData = {
    troop : [
        { name: "Ashley", age: 12 },
        { name: "Abby", age:9 }
    ]
}; 

// Create a cyclical reference
myData.troop[0]["NEWKEY"] = myData;

try {
    // BOOM
    jsonStr = Y.JSON.stringify(myData);
} catch (e) {
    alert("Cyclical references can sneak in.  Remember to wrap stringify.");
}

 

Notes about current native JSON support

 

 

分享到:
评论

相关推荐

    generator-yui3:YUI3项目脚手架

    (尚未稳定)YUI3项目的Yeoman发电机安装sudo npm install -g generator-yui3建立专案yo yui3 awesomeProject.generator-yui3.json 允许您覆盖默认配置{ "project" : "awesomeProject", "lang" : ["fr", "en", "es",...

    JavaScript YUI 2.8: DataTable jquery form 异步请求显示数据分页

    JavaScript YUI 2.8 和 DataTable 是 Yahoo! UI Library 的一部分,它提供了一种强大的方式来展示和操作表格数据。jQuery form 插件则用于处理表单的异步提交,通常用于实现无刷新的数据更新。在本文中,我们将深入...

    Struts2中使用JSON+YUI之一[包含功能代码段]

    3. **处理JSON数据**:YUI提供了解析JSON数据的方法`Y.JSON.parse()`,将JSON字符串转换为JavaScript对象,方便在前端操作。 4. **更新UI**:根据接收到的JSON数据,使用YUI的DOM操作和UI组件来更新页面内容。例如...

    Struts2+JSON+YUI组合应用之二构建RichClient

    Struts2、JSON和YUI是开发Web应用程序时常用的三个技术。它们的组合可以创建功能丰富、用户体验良好的富客户端(Rich Client)应用。下面将详细解释这三个技术以及如何结合使用来构建这样的应用。 **Struts2**:...

    yui2.9

    3. **数据管理**:YUI 2.9提供了DataSource组件,用于处理数据请求、缓存和格式化。配合Connection Manager,可以实现与服务器的数据交换,支持JSON、XML等多种数据格式。 4. **国际化与本地化**:YUI 2.9支持多...

    yui_2.6.0r2

    - JSON:JSON对象的序列化和反序列化,便于数据交换。 - Calendar:日历组件,可以方便地集成到网页中,用于日期选择。 - Drag and Drop:拖放功能,使得用户可以通过鼠标操作移动元素。 - Container:容器组件,...

    json的概念

    3. **表示复杂数据结构**:JSON不仅可以表示单个对象,还能表示数组、列表等复杂数据结构,如`{id:1,name:'zhangsan'}`和`[{id:1,name:'zhangsan'},{id:2,name:'lisi'}]`,而XML则需要使用更多的标签层次来表达同样...

    yui3.10.3最新版

    - **api**:这部分可能包含了YUI 3.10.3的API定义,可能以JSON或其他形式存在,供开发者查阅或用于自动化工具。 - **releasenotes**:发布说明文件,详细列出了3.10.3版本相对于上一版本的改进、新增功能和已知问题...

    yui 3.1.2 源码 6MB大小 0资源分

    而在3.1.2版本中,YUI的`xhr`模块也进行了优化,支持多种类型的HTTP请求,如GET、POST等,并提供了处理JSON、XML等多种数据格式的能力。 对于UI组件,YUI 3.1.2提供了诸如`button`、`checkbox`、`slider`等常见的UI...

    YAHOO YUI3简单入门

    同时,YUI3的`JSONP`模块则用于跨域数据获取,这对于获取服务器上的JSON数据非常有用。 **响应式设计** 虽然YUI3本身并不直接支持响应式设计,但它提供了丰富的工具和API,可以帮助开发者构建适应不同屏幕尺寸和...

    YUI2 库与例子都有了

    1. **核心库(Core)**:这是YUI的基础,提供事件处理、DOM操作、CSS样式处理、JSON解析等基础功能。它使得开发者能够更方便地进行页面交互和元素操作。 2. **控制台(Console)**:这是一个调试工具,用于在浏览器...

    前端项目-yui.zip

    7. **JSON和XML处理**:YUI 3 提供了处理JSON和XML数据的工具,方便在JavaScript中解析和序列化数据。 8. **国际化与本地化**:YUI 3 支持多语言环境,提供国际化和本地化功能,使应用程序能够适应不同地区的用户...

    YUI-ajax框架开发文档

    `YAHOO.widget.DataSource`则用于管理数据源,它可以与各种数据类型(如XML、JSON、CSV等)进行交互,并且可以配合`YAHOO.util.Connect`进行数据加载和刷新。 1. **YAHOO.util.Connect** - `YAHOO.util.Connect....

    针对YUI框架API

    3. **DOM操作** Node模块提供了便捷的DOM操作接口,可以快速地选取、创建、修改DOM元素,增强了JavaScript对HTML文档的操作能力。 4. **CSS样式管理** YUI的StyleSheet模块允许开发者动态修改CSS样式,实现页面...

    yui-yuidoc-yuidoc-50-529-gc631758

    3. **YUI Event System**:强大的事件系统支持事件监听和分发,使得开发者可以轻松响应用户交互和页面变化。 4. **YUI DOM utilities**:提供了丰富的 DOM 操作方法,如选择元素、修改属性、添加/删除样式等,简化...

    YUI2.8.1包括demo api是学习的好东西

    3. **事件处理**:YUI的事件系统允许开发者方便地绑定和解绑事件,处理用户交互。YUI事件模型兼容了多种浏览器,解决了跨浏览器的事件处理问题。 4. **动画效果**:YUI的Animation模块提供了创建复杂动画效果的能力...

    Yahoo JavaScript库 YUI源码

    3. **初始化YUI**:调用`YUI().use()`方法初始化YUI,并传入需要的模块。 4. **编写代码**:在回调函数中编写具体的应用逻辑,使用YUI提供的API。 **四、YUI与其他JavaScript库的比较** YUI与jQuery、Dojo、...

    Yahoo YUI2.7中文API 完整版

    此外,YUI 还提供了很多实用工具,如 JSON 解析和序列化、日期处理、字符串操作等,大大提高了开发效率。同时,YUI 社区活跃,有大量的开发者贡献插件和扩展,丰富了 YUI 的功能。 总的来说,Yahoo YUI 2.7 是一款...

    关于yui的学习

    YUI的IO模块支持Ajax请求,可以发送GET、POST等HTTP请求,处理JSON、XML等多种数据格式。例如,`Y.io('/api/data', { method: 'POST', data: JSON.stringify(data), on: { success: function(id, o) { /* 处理成功回...

    YUI英文API文档

    6. **数据和JSON**:`Y.JSON`模块提供了将JavaScript对象转换为JSON字符串,以及解析JSON数据的功能。这在与服务器进行数据交换时非常关键。 7. **AJAX和IO**:`Y.io`接口用于处理异步请求,如GET和POST,与服务器...

Global site tag (gtag.js) - Google Analytics