JSON作为一种轻量的数据传输格式,越来越受到人们的青睐。下面是我仿照Prototype的一些实现。

JSONFilter:/^///*-secure-([/s/S]*)/*///s*$/,
unfilterJSON:function(json,filter) {
    return json.replace((filter || dom.JSONFilter), function(a,b){
        return b || ""
    });
},

JSONFilter完全抄自Prototype,因为后台基本上只会传输两种格式的东西给我们——文本(xmlhttp.responseText)与XML(xmlhttp.responseXML)。如果要json,我们可以eval一下,或者使用现代浏览器提供的JSON.parse方法。但问题就出在eval中,很容易出现XSS攻击。如果文本是注释就可以避免这问题,在Prototype中还检察一下请求的来源。对于自家的网站的请求,我们完全可以在请求前处理一下,让它变成如下格式:

var text = '/*-secure-/n{"name": "Violet", "occupation": "character", "age": 25}/n*/'
 dom.unfilterJSON(text)
// -> '{"name": "Violet", "occupation": "character", "age": 25}'

到时我们用unfilterJSON函数提取合法的字段来eval就没问题了。

第二个函数,判断字符串是否符合JSON的格式。JSON是有固定的格式,要求键必须被双引号括起来。下面的函数提取自json2:

isJSONText:function(json){//
    return /^[/],:{}/s]*$/.test(json.replace(///(?:["bfnrt]|u[0-9a-fA-F]{4})/g, "@")
        .replace(/"[^"///n/r]*"|true|false|null|-?/d+(?:/./d*)?(?:[eE][+/-]?/d+)?/g, "]")
        .replace(/(?:^|:|,)(?:/s*/[)+/g, ""));
},

第三个函数,将符合JSON的格式的文本变成JSON对象。第二参数用于指明此文本是否安全(如,是否同源请求)。如果能用原生对象的parse方法就用原生的,否则动态解析它。之所以不用eval,是因为ecma那帮人头脑发热,想禁掉它。

        evalJSON: function( json ,sanitize) {  
            if ( !is(json,"String") || !json )
                return null;
            json = dom.unfilterJSON(json);
            //判定是否符合JSON的格式 from http://json.org/json2.js
            if ( !sanitize || dom.isJSONText(json) ) {
                return window.JSON && window.JSON.parse ?
                window.JSON.parse( json ) : (new Function("return " + json))();
            } else {
                throw  "Invalid JSON: " + json;
            }
        }
//http://www.21kaiyun.com
var data =dom.evalJSON( '{ "name": "Violet", "occupation": "character" }');
data.name;
//-> "Violet"

第四函数,将JSON对象变成文本。

// http://www.21kaiyun.com

//21世纪开运网 

//   var a = [1,2,3,4,{aa:8}]; puts(dom.toJSON(a))
toJSON:function(obj){
    if (window.JSON && window.JSON.stringify) {
        return JSON.stringify(obj)
    }
    if (typeof window.uneval == 'function') {
        return uneval(obj);
    }
    if (typeof obj == 'object') {
        if (!obj) {
            return 'null';
        }
        var list = [];
        if (dom.is(obj,"Array")) {
            for (var i=0,n=obj.length;i <n;i++) {
                list.push(dom.toJSON(obj[i]));
            }
            return '[' + list.join(',') + ']';
        } else {
            for (var prop in obj) {
                if(obj[has](prop))
                    list.push('"' + prop + '":' + dom.toJSON(obj[prop]));
            }
            return '{' + list.join(',') + '}';
        }
    } else if (typeof obj == 'string') {
        return '"' + obj.replace(/(["'])/g, '//$1') + '"';
    } else {
        return new String(obj);
    }
},
toJSON : function(obj) {
    if(is(window.JSON,"JSON")){
        return JSON.stringify(obj)
    }
    function f(n) {
        return n < 10 ? '0' + n : n;
    }
    var escapable = /[///"/x00-/x1f/x7f-/x9f/u00ad/u0600-/u0604/u070f/u17b4/u17b5/u200c-/u200f/u2028-/u202f/u2060-/u206f/ufeff/ufff0-/uffff]/g;
    var meta = {
        '/b': '//b',
        '/t': '//t',
        '/n': '//n',
        '/f': '//f',
        '/r': '//r',
        '"' : '//"',
        '//': ''
    };
    function _char(c) {
        return meta[c] ? meta[c] :'//u'+('0000'+(+(c.charCodeAt(0))).toString(16)).slice(-4);
    }
    function _string(s) {
        return '"' + s.replace(escapable, _char) + '"';
    }
    if(is(obj,"Date")){
        return  '"' + obj.getUTCFullYear() + '-' +
        f(obj.getUTCMonth() + 1) + '-' +
        f(obj.getUTCDate())      + 'T' +
        f(obj.getUTCHours())     + ':' +
        f(obj.getUTCMinutes())   + ':' +
        f(obj.getUTCSeconds())   + 'Z"' ;
    }else if(is(obj,"Number")){
        return isFinite(obj) ? obj+'' : 'null';
    }else if(is(obj,"Boolean")){
        return  obj+''
    }else if(is(obj,"String")){
        return _string(obj)
    }else if(obj === null){
        return "null"
    }else if(is(obj,"Array")){
        return '[' + (dom.filter(obj,function(value){
            return dom.toJSON(value) !== undefined;
        })).join(', ') + ']';
    }else if(is(obj,"Object")){
        var results = [];
        dom.each(obj,function(value,key){
            value = dom.toJSON(value)
            if (!value)
                results.push(dom.toJSON(key) + ': ' + value);
        });
        return '{' + results.join(', ') + '}';
    }else {
        return undefined;
    }
},

Is函数

目前最精确的判定方法(不包括自定义类型)

//2010.6.1更新
        var is = function (obj,type) {
        return (type === "Null" && obj === null) ||
        (type === "Undefined" && obj === void 0 ) ||
        (type === "Number" && isFinite(obj)) ||
         Object.prototype.toString.call(obj).slice(8,-1) === type;
    },

用法如下:

//***************示例一,判定数组与函数
        var forEach = function(array,fn,bind){
          if(is(array,"Array") && is(Array.forEach,"Function")){
            array.forEach(fn,bind);
          }else{
            for(var i=0,n=array.length;i<n;i++){
              i in array && fn.call(bind,array[i],i,array)
            }
          }
        }
//***************示例二,判定null
var a = null
alert(is(a,"Null"))
//***************示例二,判定undefined
var b
alert(is(b,"Undefined"))

另一个变种,直接返回表示类型的字符串

var getType = function (obj) {
  var _toString = Object.prototype.toString,undefined;
  return obj === null? "Null":
    obj === undefined ? "Undefined":
    _toString.call(obj).slice(8,-1);
};

用法:

var arr = [1,2,3,4]
      alert(getType(arr));//Array
      var nil = null
      alert(getType(nil))//Null
      var und ;
      alert(getType(und))//Undefined
      var spans = document.getElementsByTagName("span");
      alert(getType(spans)) //HTMLCollection
      alert(getType(spans[0].childNodes))//NodeList
//2010.7.20
function isA (thing, canon) {
  // special case for null and undefined
  if (thing == null || canon == null) {
    return thing === canon;
  }
  return Object.getPrototypeOf(Object(thing)) == Object.getPrototypeOf(Object(canon));
}
function isBool (thing) {
  return isA(thing, true);
}
function isNumber (thing) {
  return isA(thing, 0) && isFinite(thing);
}
function isString (thing) {
  return isA(thing, "");
}

一些JSON相关的函数相关推荐

  1. 传递json_开发技巧分享—JSON 数据格式及函数讲解

    FileMaker 16 发布之后新增了 6 个 JSON 系列函数,这对开发 FileMaker 解决方案来说简直如虎添翼. JSON 数据格式解析 对于做网站开发的前后端工程师来说,JSON 数据 ...

  2. js进阶 13-6 jquery动画效果相关常用函数有哪些

    js进阶 13-6 jquery动画效果相关常用函数有哪些 一.总结 一句话总结:animate(),stop(),finish(),delat()四个. 1.stop()方法的基本用法是什么(sto ...

  3. C语言 system相关的函数

    system相关的函数 clrscr,ClearScreen DispBCD SetScrollBar TextOut,outtextxy TextOut bell block cursor dela ...

  4. C语言 字符串相关的函数

    字符串相关的函数 bcmp bcopy bzero memccpy memchr memcmp memcpy memicmp memmove memset movmem setmem stpcpy s ...

  5. C语言的math相关的函数

    C语言的math相关的函数 fabs abs acos asin atan atan2 ceil cos cosh exp fabs floor fmod hypot ldexp log log10 ...

  6. linux 与信号集操作相关的函数

    与信号集操作相关的函数 #include <signal.h> 清空信号集 全都为0 int sigemptyset(sigset_t *set);填充信号集 全都为1 int sigfi ...

  7. 详解Mysql中的JSON系列操作函数

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 一.方法罗列: 分类 函数 描述 创建json json_array 创建json数组 json_o ...

  8. mysql的json函数与实例_Mysql实例详解Mysql中的JSON系列操作函数

    <Mysql实例详解Mysql中的JSON系列操作函数>要点: 本文介绍了Mysql实例详解Mysql中的JSON系列操作函数,希望对您有用.如果有疑问,可以联系我们. MYSQL必读前言 ...

  9. 零基础带你学习MySQL—字符串相关的函数(十三)

    零基础带你学习MySQL-字符串相关的函数(十三) 一.CHARSET (str)返回子串字符集 二.CONCAT连接子串,将多个列拼接成一列 三.INSTR(string,substring)返回s ...

最新文章

  1. 1103 Integer Factorization 需再做
  2. java 查询sql_java如何实现sql连接和查询的代码?
  3. angular4创建html,angular 4减少html内容
  4. python 微信爬虫_python3简单实现微信爬虫
  5. 初学__Python——Python 函数参数的使用
  6. 如果 “ 2X ”的补码是“ 90H ”,那么 X 的真值是( )。
  7. linux安装了xml怎么编译,linux下libxml库的安装及编译
  8. VUE3.x的基本使用
  9. web前端是不是没有前景了?
  10. React Router学习
  11. [转]VS .NET 2005中水晶报表的打包部署
  12. 算法第四版 高清完整中文版(非纸质版)
  13. A very hard mathematic problem(二分)
  14. 7-8 哈利·波特的考试 (20 分)
  15. distribute by sort by
  16. 最新消息,青岛的农贸市场将迎来大变革
  17. Nacos——注册中心
  18. kmeans以及kmeans++聚类生成anchors
  19. 云虚拟主机连接mysql_云虚拟主机数据库使用
  20. wmf图片linux,WMF 文件扩展名: 它是什么以及如何打开它?

热门文章

  1. python3.6.2怎样安装,python 3.6.2 安装配置方法图文教程
  2. 计算机一级考试模拟题函数,2015年计算机一级考试模拟题(四)
  3. oracle java rmi 漏洞,Oracle Java SE Java运行时环境RMI子组件远程漏洞(CVE-2011-3556)
  4. 兹介绍我校计算机科学与技术,清华大学计算机科学与技术系
  5. server vscode中的live_太方便了!这款神器能在浏览器中运行 VS Code,随时随地写代码...
  6. 图像分割:Python的SLIC超像素分割
  7. .pgr照片文件解析,C++与Java存储数据差别大小端模式
  8. 3.实现串口功能及消息邮箱
  9. vs2012与win7不兼容问题
  10. ubuntu 14.04 64 bit上开启nscd服务缓存加速及清除dns缓存