Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否将JSON对象转换为嵌套表单字段?_Javascript_Jquery_Json - Fatal编程技术网

Javascript 是否将JSON对象转换为嵌套表单字段?

Javascript 是否将JSON对象转换为嵌套表单字段?,javascript,jquery,json,Javascript,Jquery,Json,任何人都知道将JSON对象转换为嵌套表单字段的好方法 例如:考虑一个JSON对象: {'a':{'b':{'c':'1200'}}}, 'z':'foo', 'bar':{'baz':'1', 'id':2}} 我应该得到: {'a[b][c]':'1200', 'z':'foo', 'bar[baz]':'1', 'bar[id]':2}; 有什么想法吗 我目前正在使用jquery,感觉像这样的东西已经存在了,如果不是的话,我可以简单地用一个疯狂的算法来实现我自己的,但我更愿意使用一个经过

任何人都知道将JSON对象转换为嵌套表单字段的好方法

例如:考虑一个JSON对象:

{'a':{'b':{'c':'1200'}}}, 'z':'foo', 'bar':{'baz':'1', 'id':2}}
我应该得到:

{'a[b][c]':'1200', 'z':'foo', 'bar[baz]':'1', 'bar[id]':2};
有什么想法吗


我目前正在使用jquery,感觉像这样的东西已经存在了,如果不是的话,我可以简单地用一个疯狂的算法来实现我自己的,但我更愿意使用一个经过验证的记录。

所以,我不知道你为什么要做你说你想做的事情,我希望你能告诉我们所有人,但此代码应该足够接近,以便您能够调整它(这是基于):

下面是我为测试它所做的:

doStrangeThing({'a':{'b':{'c':'1200'}}, 'z':'foo', 'bar':{'baz':'1', 'id':2}});
这将导致该值:

{"a[b][c]":"1200","z":"foo","bar[baz]":"1","bar[id]":"2"}
希望这对你有所帮助

obj = {'a':{'b':{'c':'1200'}}}, 'z':'foo', 'bar':{'baz':'1', 'id':2}}
内部等同于

{['a']['b']['c']:'1200', ['z']:'foo', ['bar']['baz']:'1', ['bar']['id']:2}
请注意,这不再是JSON对象

您已经可以通过以下方式引用第一个对象属性:

var z = obj['a']['b']['c']   // 1200

这足够满足你的需要吗?是否确实要将属性名转换为变量?

我建议使用一个函数,该函数接受嵌套的JSON对象并将其转换为HTTP POST字符串。对于所有需要HTTP参数的参数,jQuery都会接受这一点

我已在多个生产应用程序中编写并使用了以下功能(使用风险自负):

$.httpSerialize=函数(项,父项名称){
var serializedItems=[],serialize=arguments.callee,encodeItem=function(键,值){
if(value==null | | typeof value==undefined)返回值;
if(value.constructor==Array){return serialize(value,key);}
返回(value.constructor==对象)
?序列化(值、键)
:(值===true | |值===false)
?键+“=”+新编号(值)
:key+“=”+encodeURIComponent(值);
};
if(items.constructor==数组){
parentName=parentName | |“项”;
对于(变量i=0;i
什么是嵌套表单字段?这些是字段集元素吗?我不太明白你在暗示从第一个物体到第二个物体的算法是什么。嗯,这到底是什么乱七八糟的?您可能需要提供一些澄清,因为如果没有更多的上下文,这就没有太多意义……您已经可以将元素称为obj['a']['b'['c']将表单字段遍历算法改得更好一点?我也有同样的问题,我使用FormData传递一些文件附件,但是如果我有一个大的嵌套表单,那么使用form.append方法是非常乏味的。一旦它到达服务器端,在php中它就会变成一个嵌套的哈希映射。好吧,如果它对您有效,请将其标记为答案-我不知道我对PHP一无所知,也不知道这方面的需要,但显然你有自己的理由。:)同样,它可能需要一些调整,以使它完全按照你的意愿运行,但这对我来说测试和使用起来比较快,因为我很久以前就写过这段代码……当我说“调整”时顺便说一句,我的意思是让值类型正常工作-我看到您希望“bar[id]”的值是文字数字2,而不是字符串(“2”)-你可以调整代码来测试某个东西是否是数字,如果是,不要使用引号;等等。Jason Bunting:+1免费这么做。我知道这有多么讽刺。:@JasonBunting如果你像我一样坚持使用FormData,这是非常相关的:)。当我读到这个答案时,我不得不大笑,因为我觉得我感觉到了读t时的感觉他提出了一个问题,即世跆联这家伙会处理这个烂摊子吗?尽管如此,这是一个有趣的练习,但我不知道“未知”是什么在PHP中处理这些东西。奇怪的东西。事实上,我得到了他想要的东西。很奇怪,但它有一些意义。然而,有很多更简单的算法方法来实现相同的目标…如果它应该被实现为通用的话,那么变量名和名称空间将变得一团糟。
var z = obj['a']['b']['c']   // 1200
$.httpSerialize = function(items, parentName) {
    var serializedItems = [], serialize = arguments.callee, encodeItem =     function(key, value) {
        if (value === null || typeof value == 'undefined') return value;
        if (value.constructor == Array) {return serialize(value, key);}
        return (value.constructor == Object)
            ? serialize(value, key)
            : (value === true || value === false)
                ? key+"="+new Number(value)
                : key+"="+encodeURIComponent(value);
    };

    if (items.constructor == Array) {
        parentName = parentName || 'item';
        for (var i = 0; i < items.length; i++) {
            var key = parentName+'['+i+']', value = items[i];
            serializedItems.push(encodeItem(key, value));
        }
    } else {
        parentName = parentName || '';
        for (var key in items) {
            var value = items[key];
            if (parentName) {
                serializedItems.push(encodeItem(parentName+'['+encodeURIComponent(key)+']', value));
            } else {
                serializedItems.push(encodeItem(encodeURIComponent(key), value));
            }
        }
    }
    return serializedItems.join("&");
};