用于为ajax请求序列化javascript对象的递归函数 - 有更简单的方法吗?

时间:2013-03-15 22:47:11

标签: javascript ajax json serialization

这是我编写的一个函数和帮助程序,用于序列化一个javascript对象以便在ajax请求中发送。有可能在某个地方有一个更有效的解决方案,可能在jQuery库中,但我找不到一个。不是一个javascript对象。

/*
@author Benjamin Yep
@important - THIS FUNCTION ASSUMES INPUT ENCODED ACCORDING RFC 3986 see here: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURIComponent
@param data - Any javascript object or array.
@param pName - The name of the object to be sent in your ajax request.
@return A serialized JSON-encoded object, ready to send in a request.
Usage:
var someObject={
"foo":"bar",
"bars":["foo","bar"],
"object":{
    "foo":1,
    "bar":2",
},
};
var r=makeHttpObject();//new ajax object
r.open("get","example.php",false);
r.send(paramify(someObject,"varname"));
//In example.php
<?php
echo var_dump($_POST['varname']);
?>
//back in the javascript file
console.log(r.responseText);//shows the contents of the object you sent to the server
*/
function paramify(data,pName){
return constructObject(data,pName).substr(1);
}
function constructObject(data,path){
var contents="";
for(var key in data){
    var curpath=path+"["+key+"]";
    if(Object.prototype.toString.call(data[key])==='[object Object]'||data[key] instanceof Array){
        if(!(data[key] instanceof Array)||data[key].length!=0){
            if(JSON.stringify(data[key])=="{}"){
                contents+="&"+curpath+"={}";
            }else{
                contents+=constructObject(data[key],curpath);
            }
        }else{
            contents+="&"+curpath+"=[]";
        }
    }
    else{
        contents+="&"+curpath+"="+data[key];
    }
}
return contents;
}

2 个答案:

答案 0 :(得分:1)

就效率而言,你可以对这种功能做出很多改进。

但是,您应该能够在函数中以相同的方式处理对象和数组。 for...in循环可以正常使用数字键。

另外,请确保使用encodeURIComponent()

对输入的所有内容进行编码

答案 1 :(得分:-1)

请看这个插件

jquery json

  

这个插件在(root)jQuery对象上公开了四个新方法:

     

toJSON:将javascript对象,数字,字符串或数组序列化为   JSON。

     

evalJSON:快速,轻松地从JSON转换为Javascript。

     

secureEvalJSON:从JSON转换为Javascript,但同时执行此操作   检查源是否实际上是JSON,而不是其他   抛出Javascript语句。

     

quoteString:在字符串周围放置引号,并智能地转义   任何引号,反斜杠或控制字符。