我试图根据特定数据创建动态JSON对象。 Source code
如果我输入以下文字:
here
is
an:example
of:
how:this:works
它生成:
[
"here",
"is",
{
"an": "example"
},
{
"of": ""
},
{
"how": {
"this": "works"
}
}
]
如何让它返回以下内容:(因为foo没有值,将对象推送到数组中)
[
"here",
"is",
{
"an": "example"
},
{
"of": [
"how": {
"this": "works"
}
]
}
]
答案 0 :(得分:1)
你的问题不是很明确,所以我不得不猜...你想把of:
后的所有值都放到一个数组中吗?所以基本上可以用缩进来写原始输入,如下所示(每个缩进都表示一个新数组)?
here
is
an:example
of:
how:this:works:
foo:bar
example
此外,您的第二个JSON示例不正确,of:
数组的内容必须用大括号括起来,因为数组不能有键。
好吧,假设您想获得我上面描述的结果,您可以通过递归轻松完成此操作:
var jsonify = function(input) {
var helper = function(items) {
var end = [];
for (i = 0; i < items.length; ++i) {
var itemparts = items[i].split(':');
var value = itemparts.pop();
var dobreak = false;
while (itemparts.length) {
var obj = {};
if (value == "" && i+1 < items.length) {
// Recursive call
value = helper(items.slice(i+1,items.length));
dobreak = true;
}
obj[itemparts.pop()] = value;
value = obj;
}
end.push(value);
if (dobreak) {
break;
}
}
return end;
};
return helper(input.split('\r\n'));
};
此函数搜索零长度值并检查以下行中是否有值。如果是这样,则后面的所有值(items.slice(...)
)将使用相同的函数(即递归)单独处理,以将它们放入数组中。
使用上面的示例输入调用jsonify
时,您将获得以下JSON:
[
"here",
"is",
{
"an": "example"
},
{
"of": [
{
"how": {
"this": {
"works": [
{
"foo": "bar"
},
"example"
]
}
}
}
]
}
]
希望有帮助......;)