2012-08-07 66 views
0

我试图创建一个基于特定数据的动态JSON对象。 Source codeJavascript生成动态json响应

如果我输入以下文本:

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" 
     } 
    ] 
    } 
] 

回答

1

你的问题不太清楚,所以我不得不顾ess ...你是否想将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" 
         ] 
        } 
       } 
      } 
     ] 
    } 
] 

希望帮助...;)