帶有function的JSON對象的序列化與還原

 

 

JSON對象的序列化與反序列化相信你們都很熟悉了。基本的api是JSON.parse與JSON.stringify.json

複製代碼
var json={
    uiModule:'http://www.a.com',
    login:'true',
    mainSubjectId:3004,
    happydays:100,
    happyhours:1,
    userCount :200,
    itemCount:1000000,
    type:'all',
    mainSubjectId:3004,
    taglist:[
        {'tagName':'xiaoc','applyItemCount':20},
        {'tagName':'xiaoc','applyItemCount':20}
    ]
}

var s=JSON.stringify(json)
複製代碼

 

輸出:api

複製代碼
"{"uiModule":"http://www.a.com","login":"true","mainSubjectId":3004,"happydays":100,"happyhours":1,"userCount":200,"itemCount":1000000,"type":"all","taglist":[{"tagName":"xiaoc","applyItemCount":20},{"tagName":"xiaoc","applyItemCount":20}]}"

JSON.parse(s)
複製代碼

 

輸出:app

 ok 到如今爲止都沒啥問題,處理得很好,可是如今我有這麼一個json對象函數

複製代碼
var json={
  name:'json',
  getName:function(){
     return this.name;   
  }
}
複製代碼

 

咱們看下JSON.stringify(json)輸出啥post

"{"name":"json"}"ui

尼瑪把getName弄丟了 ,怎麼辦呢?其實你們都沒注意到JSON.stringify還有些參數this

 

複製代碼
JSON.stringify(value [, replacer] [, space])

value

Required. A JavaScript value, usually an object or array, to be converted.

replacer

Optional. A function or array that transforms the results.

If replacer is a function, JSON.stringify calls the function, passing in the key and value of each member. The return value is used instead of the original value. If the function returns undefined, the member is excluded. The key for the root object is an empty string: "".

If replacer is an array, only members with key values in the array will be converted. The order in which the members are converted is the same as the order of the keys in the array. The replacer array is ignored when thevalue argument is also an array.

space

Optional. Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.

If space is omitted, the return-value text is generated without any extra white space.

If space is a number, the return-value text is indented with the specified number of white spaces at each level. Ifspace is greater than 10, text is indented 10 spaces.

If space is a non-empty string, such as '\t', the return-value text is indented with the characters in the string at each level.

If space is a string that is longer than 10 characters, the first 10 characters are used.
複製代碼

 

那咱們如今就能夠把函數也序列化了spa

複製代碼
var s=JSON.stringify(json, function(key, val) {
  if (typeof val === 'function') {
    return val + '';
  }
  return val;
});


"{"name":"json","getName":"function (){\n     return this.name;   \n  }"}"
複製代碼

 

ok如今咱們已經成功的序列化帶function的json對象了,接下來如何還原它呢?code

直接JSON.parse(s)?  騷年你仍是太年輕了。orm

JSON.parse(s)輸出的是

其實JSON.parse和JSON.stringify同樣也有些其餘參數

複製代碼
JSON.parse(text [, reviver])

text
  Required. A valid JSON string.
reviver
  Optional. A function that transforms the results. This function is called for each member of the object. If a member contains nested objects, the nested objects are transformed before the parent object is. For each member, the following occurs:
If reviver returns a valid value, the member value is replaced with the transformed value.
If reviver returns the same value it received, the member value is not modified.
If reviver returns null or undefined, the member is deleted.
複製代碼

 

那麼咱們就能夠這麼來還原json對象

複製代碼
JSON.parse(s,function(k,v){

  if(v.indexOf&&v.indexOf('function')>-1){

     return eval("(function(){return "+v+" })()")

  }

  return v;

});
複製代碼

輸出:

經過這種方式咱們也能夠徹底深拷貝一個json對象了。

參考資料:http://msdn.microsoft.com/en-us/library/ie/cc836466(v=vs.94).aspx

相關文章
相關標籤/搜索