function付きJSONオブジェクトのシーケンス化と復元



 
JSONオブジェクトのシーケンス化と逆シーケンス化はよく知られていると思います.基本的なapiはJSONです.parseとJSON.stringify.
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)


 
出力:
"{"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)


 
出力:
带有function的JSON对象的序列化与还原_第1张图片
OKは今まで問題なくよく処理されていましたが、今はこのようなjsonオブジェクトがあります.
var json={
  name:'json',
  getName:function(){
     return this.name;   
  }
}


 
JSONを見てみましょうstringify(json)は何を出力しますか?
"{"name":"json"}"
ニマはgetNameをなくしました.どうすればいいですか.実はみんなJSONに気づかなかった.stringifyにはパラメータもあります
 
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.


 
では、関数もシーケンス化できます.
var s=JSON.stringify(json, function(key, val) {
  if (typeof val === 'function') {
    return val + '';
  }
  return val;
});


"{"name":"json","getName":"function (){
return this.name;
}"}"


 
OK現在、function付きjsonオブジェクトのシーケンス化に成功していますが、次にどのように復元しますか?
直接JSONparse(s)?君はまだ若すぎる.
JSON.parse(s)が出力するのは

実はJSON.parseとJSONstringifyにも他のパラメータがあります
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
転載先:https://www.cnblogs.com/sparkbj/p/8203343.html