【问题标题】:Recursive function to serialize a javascript object for an ajax request - is there an easier way?用于为 ajax 请求序列化 javascript 对象的递归函数 - 有没有更简单的方法?
【发布时间】:2013-03-15 22:47:11
【问题描述】:

这是我编写的一个函数和助手,用于序列化 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;
}

【问题讨论】:

  • 假设你不需要支持IE
  • 我在向服务器发送 JSON 编码字符串时遇到的问题是存储在 JSON 中的每个 uri-component-encode 编码值都由我的服务器自动解码,这不是个别变量的问题,因为我可以重新编码数据服务器端,但如果它全部在 JSON 字符串中;好吧,我无法对整个字符串进行编码,因此数据基本上丢失了。但也许我应该考虑使用 XHL 库;我研究了 moo-tools,这似乎很容易使用。
  • +1 用于 Mootools,尽管几乎每个库都将 XHR 请求抽象为更易于使用的界面。

标签: javascript ajax json serialization


【解决方案1】:

就效率而言,您无法对此类功能进行很多改进。

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

另外,请确保使用 encodeURIComponent() 对进入输出的所有内容进行编码

【讨论】:

    【解决方案2】:

    请看这个插件

    jquery json

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

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

    evalJSON:从 JSON 转换为 Javascript,快速且简单。

    secureEvalJSON:从 JSON 转换为 Javascript,但这样做的同时 检查源是否实际上是 JSON,而不是其他 抛出的 Javascript 语句。

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

    【讨论】:

    • 他正在寻找一种方法将其编码为查询字符串,而不是 json。
    猜你喜欢
    • 2011-04-20
    • 1970-01-01
    • 2021-03-24
    • 2012-01-11
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    相关资源
    最近更新 更多