0

我试图创建一个基于特定数据的动态 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"
      }
    ]
  }
]
4

1 回答 1

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

希望对您有所帮助... ;)

于 2012-08-07T12:33:50.080 回答