あなたの質問はあまり明確ではないので、私は推測する必要があります... 続くすべての値をof:
配列に入れますか? したがって、基本的には、次のようにインデントを使用して元の入力を記述できます (すべてのインデントは新しい配列を示します)。
here
is
an:example
of:
how:this:works:
foo:bar
example
さらに、2 番目の 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"
]
}
}
}
]
}
]
それが役立つことを願っています...;)