[英]Convert a JSON object to nested form fields?
任何人都知道将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,感觉像这样的东西已经存在,如果没有,我可以简单地用一个疯狂的算法推出自己的东西,但是我宁愿使用具有可靠记录的东西。
因此,我不知道您为什么要按照自己的意愿去做,我希望您能将我们全部纳入其中,但是这段代码应该足够接近,您可以对其进行调整(这基于某些我用来查找JavaScript对象图中差异的代码 :
function doStrangeThing(obj) {
var propertyChanges = [];
var objectGraphPath = [];
(function(obj, refObj) {
if ( obj.constructor == Object || (obj.constructor != Number &&
obj.constructor != String && obj.constructor != Date && obj.constructor != Boolean &&
obj.constructor != RegExp && obj.constructor != Function)) {
for (var property in obj) {
objectGraphPath.push((objectGraphPath.length > 0) ? "[" + property + "]" : property);
if (obj[property].constructor != Function) {
if (!refObj[property]) refObj[property] = {};
arguments.callee(obj[property], refObj[property]);
}
objectGraphPath.pop();
}
} else if (obj.constructor != Function) {
if (obj != refObj) {
propertyChanges.push("\"" + objectGraphPath.join("") + "\":\"" + obj.toString() + "\"");
}
}
})(obj, {});
return "{" + propertyChanges.join(",") + "}";
}
这是我所做的测试:
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字符串的函数。 jQuery将接受所有需要HTTP参数的参数。
我已经在多个生产应用中编写并使用了以下功能(使用后果自负):
$.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("&");
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.