Javascript生成动态json响应

时间:2012-08-07 06:54:21

标签: javascript json string parsing

我试图根据特定数据创建动态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"
      }
    ]
  }
]

1 个答案:

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

希望有帮助......;)