带有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)

输出:

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 (){\n     return this.name;   \n  }"}"

ok现在我们已经成功的序列化带function的json对象了,接下来如何还原它呢?

直接JSON.parse(s)?  骚年你还是太年轻了。

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

原文地址:https://www.cnblogs.com/sparkbj/p/8203343.html

时间: 2024-10-24 15:08:49

带有function的JSON对象的序列化与还原的相关文章

利用JavaScriptSerializer类 进行Json对象的序列化和反序列化和过滤

项目下载:JavaScriptSerializer_对JSON对象序列化与反序列化及过滤器 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 1. 首先, JavascriptSerializer类所在名空间: using System.Web.Script.Serialization; 2. 相关的3篇文章, 标记下: 使用JavaScriptSerializer进行JSON序列化 注意:    是复杂对象. JSON是Javascript中常用的数据格

利用 进行Json对象的序列化和反序列化 - RJ - 博客园

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 - RJ - 博客园 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 进行Json对象的序列化和反序列化 - RJ - 博客园,bubuko.com" href="http://www.bubuko.com/infodetail-217182.html" target=_blank>利用 进行Json对象的序列化和反序列

JavaScript - 问题集 - 含function的json对象与json字符串之间相互转换

基本的转换为:JSON.parse与JSON.stringify. 但是json数据中含function,则转换后,function会丢失,如: var json={ test:'test', login: function(){ alert("login") } } 经JSON.stringify后,login丢失. var json={ test:'test' } JSON.parse,结果一样. 正确处理方法: // json对象转换成字符串 var s=JSON.stringi

利用&lt;JavascriptSerializer类&gt; 进行Json对象的序列化和反序列化

1. 首先, JavascriptSerializer类所在名空间: using System.Web.Script.Serialization; 2. 相关的3篇文章, 标记下: 使用JavaScriptSerializer进行JSON序列化 注意:    是复杂对象. JSON是Javascript中常用的数据格式,然而,在.NET 2.0中没有内置序列化JSON的类,原因估计是当时Ajax尚未兴起.后来就有人写了一个Json.NET类库..NET 3.5新增了一个把对象序列化为JSON字符

json对象的序列化和反序列化

//Json.NET序列化 string jsonData = JsonConvert.SerializeObject(对象model); //Json.NET反序列化 string json = @"{ 'Name':'C#','Age':'3000','ID':'1','Sex':'男'}"; Student descJsonStu = JsonConvert.DeserializeObject<对象>(json);//反序列化 感谢:http://www.cnblog

JSON数据的序列化方法

ajax传参是json数据对象时,最好是将json对象先序列化 var stuAnswerTotal = examModule.touch.getData('examAnswer'); console.log(stuAnswerTotal);//Object对象如下 { 17072={ "id" : 1702, "type":"1",                "val":["",'"&quo

js实现对json数据的序列化(兼容ie6以上浏览器)

/** * 增加对JSON数据的序列化方法, * 主要用于IE6.7不支持JSON对象的浏览器 */ var xue = xue || {};xue.json = xue.json || {}; xue.json.stringify = function(obj) {    //如果是IE8+ 浏览器(ff,chrome,safari都支持JSON对象),使用JSON.stringify()来序列化    if (window.JSON) {        return JSON.stringi

javascript中字符串格式json如何转化成json对象

什么是JSON JSON(JavaScript Object Notation)是一种优美的JavaScript对象创建方法.JSON也是一种轻量级数据交换格式.JSON非常易于人阅读与编写,同时利于机器解析与生成.JSON是在AJAX中代替XML交换数据的更佳方案. JSON格式与语法 var jsonobject={        //对象内的属性语法(属性名与属性值是成对出现的)        propertyname:value, //对象内的函数语法(函数名与函数内容是成对出现的)  

javascript中字符串格式转化成json对象记录

什么是JSON JSON(JavaScript Object Notation)是一种优美的JavaScript对象创建方法.JSON也是一种轻量级数据交换格式.JSON非常易于人阅读与编写,同时利于机器解析与生成.JSON是在AJAX中代替XML交换数据的更佳方案. JSON格式与语法 var jsonobject= {         //对象内的属性语法(属性名与属性值是成对出现的)         propertyname:value, //对象内的函数语法(函数名与函数内容是成对出现的