动态给json添加属性

 

//addJSON –end

//-------------------------------------------------

// add json(目前只对添加数组,字符串类型有效待完善中)

// flag 用来判断是添加属性还是创建jsontrue 为添加属性)

//调用方法为: 1创建json ob.addJSON(‘’,name,value,false)

//调用方法为: 2添加属性: ob.addJSON(path,name,value,true)

Object.prototype.addJSON=function(path,name,value,flag){

 var jsonstr=new String();

      if (!flag )

       {

              if (name instanceof Array)

               { 

                  jsonstr +='{"' + path + '":';

                 for (i=0;i<name.length;i++)

                  {

                        var p =this.length;

                        //alert(p);

                        if (i==0)

                        {jsonstr +='[{ "' + name[i] + '":"' + value[i] + '"';}

                        else

                        {jsonstr +=',"' + name[i] + '":"' + value[i] + '"';      }

                   }

                      jsonstr +='}]}';

                      var newjson=jsonstr.parseJSON();

                                         alert(jsonstr);

                      var newjson=jsonstr.parseJSON();

                      text=newjson.toJSONString();

             alert(text);

                      this[path]=newjson;

                        return this;

               }

               //如果是字符串类型

               else

               {

                      var p =this.length;

                      jsonstr='{ "' + name + '":"' + value + '"}';

                      alert(jsonstr);

                      var newjson=jsonstr.parseJSON();

                      text=newjson.toJSONString();

             alert(text);

                    this[path]=newjson;

                        return this;

               }

       }

       else

       {

              //如果是数组类型

              if (name instanceof Array)

               {

                 for (i=0;i<name.length;i++)

                  {

                            //alert(name.length);

                       

                        //alert(p);

                        if (i==0)

                        {jsonstr +='{ "' + name[i] + '":"' + value[i] + '"';}

                        else

                        {jsonstr +=',"' + name[i] + '":"' + value[i] + '"';      }

                   }

                      jsonstr +='}';

                      var p =this[path].length;

                      var newjson=jsonstr.parseJSON();

                        this[path][p]=newjson;

               }

               //如果是字符串类型

               else

               {

                      var p =this[path].length;

                      jsonstr='{ "' + name + '":"' + value + '"}';

                      var newjson=jsonstr.parseJSON();

                   this[path][p]=newjson;

               }

                 return this;

      }

}

//addJSON –end

//------------------------------------------------------------------------------     

//以下为官方提供的json

if (!Object.prototype.toJSONString) {

    Array.prototype.toJSONString = function (w) {

        var a = [],     // The array holding the partial texts.

            i,          // Loop counter.

            l = this.length,

            v;          // The value to be stringified.

// For each value in this array...

        for (i = 0; i < l; i += 1) {

            v = this[i];

            switch (typeof v) {

            case 'object':

// Serialize a JavaScript object value. Treat objects thats lack the

// toJSONString method as null. Due to a specification error in ECMAScript,

// typeof null is 'object', so watch out for that case.

                if (v && typeof v.toJSONString === 'function') {

                    a.push(v.toJSONString(w));

                } else {

                    a.push('null');

                }

                break;

            case 'string':

            case 'number':

            case 'boolean':

                a.push(v.toJSONString());

                break;

            default:

                a.push('null');

            }

        }

// Join all of the member texts together and wrap them in brackets.

        return '[' + a.join(',') + ']';

    };

    Boolean.prototype.toJSONString = function () {

        return String(this);

    };

    Date.prototype.toJSONString = function () {

// Eventually, this method will be based on the date.toISOString method.

        function f(n) {

// Format integers to have at least two digits.

            return n < 10 ? '0' + n : n;

        }

        return '"' + this.getUTCFullYear()   + '-' +

                   f(this.getUTCMonth() + 1) + '-' +

                   f(this.getUTCDate())      + 'T' +

                   f(this.getUTCHours())     + ':' +

                   f(this.getUTCMinutes())   + ':' +

                   f(this.getUTCSeconds())   + 'Z"';

    };

    Number.prototype.toJSONString = function () {

// JSON numbers must be finite. Encode non-finite numbers as null.

        return isFinite(this) ? String(this) : 'null';

    };

    Object.prototype.toJSONString = function (w) {

        var a = [],     // The array holding the partial texts.

            k,          // The current key.

            i,          // The loop counter.

            v;          // The current value.

// If a whitelist (array of keys) is provided, use it assemble the components

// of the object.

        if (w) {

            for (i = 0; i < w.length; i += 1) {

                k = w[i];

                if (typeof k === 'string') {

                    v = this[k];

                    switch (typeof v) {

                    case 'object':

// Serialize a JavaScript object value. Ignore objects that lack the

// toJSONString method. Due to a specification error in ECMAScript,

// typeof null is 'object', so watch out for that case.

                        if (v) {

                            if (typeof v.toJSONString === 'function') {

                                a.push(k.toJSONString() + ':' +

                                       v.toJSONString(w));

                            }

                        } else {

                            a.push(k.toJSONString() + ':null');

                        }

                        break;

                    case 'string':

                    case 'number':

                    case 'boolean':

                        a.push(k.toJSONString() + ':' + v.toJSONString());

// Values without a JSON representation are ignored.

                    }

                }

            }

        } else {

// Iterate through all of the keys in the object, ignoring the proto chain

// and keys that are not strings.

            for (k in this) {

                if (typeof k === 'string' &&

                        Object.prototype.hasOwnProperty.apply(this, [k])) {

                    v = this[k];

                    switch (typeof v) {

                    case 'object':

// Serialize a JavaScript object value. Ignore objects that lack the

// toJSONString method. Due to a specification error in ECMAScript,

// typeof null is 'object', so watch out for that case.

                        if (v) {

                            if (typeof v.toJSONString === 'function') {

                                a.push(k.toJSONString() + ':' +

                                       v.toJSONString());

                            }

                        } else {

                            a.push(k.toJSONString() + ':null');

                        }

                        break;

                    case 'string':

                    case 'number':

                    case 'boolean':

                        a.push(k.toJSONString() + ':' + v.toJSONString());

// Values without a JSON representation are ignored.

                    }

                }

            }

        }

// Join all of the member texts together and wrap them in braces.

        return '{' + a.join(',') + '}';

    };

    (function (s) {

// Augment String.prototype. We do this in an immediate anonymous function to

// avoid defining global variables.

// m is a table of character substitutions.

        var m = {

            '"b': '""b',

            '"t': '""t',

            '"n': '""n',

            '"f': '""f',

            '"r': '""r',

            '"' : '"""',

            '""': '""""'

        };

        s.parseJSON = function (filter) {

            var j;

            function walk(k, v) {

                var i, n;

                if (v && typeof v === 'object') {

                    for (i in v) {

                        if (Object.prototype.hasOwnProperty.apply(v, [i])) {

                            n = walk(i, v[i]);

                            if (n !== undefined) {

                                v[i] = n;

                            }

                        }

                    }

                }

                return filter(k, v);

            }

// Parsing happens in three stages. In the first stage, we run the text against

// a regular expression which looks for non-JSON characters. We are especially

// concerned with '()' and 'new' because they can cause invocation, and '='

// because it can cause mutation. But just to be safe, we will reject all

// unexpected characters.

// We split the first stage into 3 regexp operations in order to work around

// crippling deficiencies in Safari's regexp engine. First we replace all

// backslash pairs with '@' (a non-JSON character). Second we delete all of

// the string literals. Third, we look to see if only JSON characters

// remain. If so, then the text is safe for eval.

            if (/^[,:{}"["]0-9."-+eE "n"r"t]*$/.test(this.

                    replace(/""./g, '@').

                    replace(/"[^""""n"r]*"|true|false|null/g, ''))) {

// In the second stage we use the eval function to compile the text into a

// JavaScript structure. The '{' operator is subject to a syntactic ambiguity

// in JavaScript: it can begin a block or an object literal. We wrap the text

// in parens to eliminate the ambiguity.

                j = eval('(' + this + ')');

// In the optional third stage, we recursively walk the new structure, passing

// each name/value pair to a filter function for possible transformation.

                return typeof filter === 'function' ? walk('', j) : j;

            }

// If the text is not JSON parseable, then a SyntaxError is thrown.

            throw new SyntaxError('parseJSON');

        };

        s.toJSONString = function () {

// If the string contains no control characters, no quote characters, and no

// backslash characters, then we can simply slap some quotes around it.

// Otherwise we must also replace the offending characters with safe

// sequences.

            if (/[""""x00-"x1f]/.test(this)) {

                return '"' + this.replace(/["x00-"x1f"""]/g, function (a) {

                    var c = m[a];

                    if (c) {

                        return c;

                    }

                    c = a.charCodeAt();

                    return '""u00' + Math.floor(c / 16).toString(16) +

                                               (c % 16).toString(16);

                }) + '"';

            }

            return '"' + this + '"';

        };

    })(String.prototype);

}
//与朋友共同探讨

转载于:https://www.cnblogs.com/hwff/archive/2007/10/10/918914.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值