从JSON解析一个数组,其中每个字段键都是一个数字

时间:2012-06-05 21:55:22

标签: javascript arrays json

我基本上需要做的是,给出一个类似

的json
{
  "1" : "a",
  "7" : "something"
  "3" : {
      "1" : "blah"
  }
}

将这些转换为数组(比如x)。

x[1] = "a"
x[7] = "something"
x[3] = y (where y[1] = "blah")

4 个答案:

答案 0 :(得分:0)

您需要将JSON反序列化为非数组对象图,然后将属性复制到数组中。我不知道它的任何捷径。

将JSON反序列化为obj后的基本循环大致是:

var ar;
var key;

ar = [];
for (key in obj) {
    if (obj.hasOwnProperty(key)) {
        ar[key] = obj[key];
    }
}

...除了你必须检测obj[key]是一个对象并递归,我将留给读者作为练习。


请注意,在JavaScript中,arrays aren't really arrays。根据您的使用情况,您可能根本不需要从对象转换为Array

答案 1 :(得分:0)

我很确定在Javascript中,您可以访问:

x = {
  "1" : "a",
  "7" : "something",
  "3" : {
      "1" : "blah"
  }
}

像这样:

alert( x["1"] );

应警告“a”。正如人们在上面的评论中已经提到的那样,JS中的数组已经是一个“对象”,并且以这两种不同的方式访问它们之间没有区别。

编辑:

是的,我只是测试了它,它的工作原理。另外,我试过这个:

alert( x[1] );

也就是说,我尝试使用“数字”1,而不是“字符串”“1”。它仍然奏效。是的,这是一种非常奇怪的编程语言。

答案 2 :(得分:0)

我认为这非常接近:

function parse_obj(obj)
{
    var array = [];
    var prop;
    for (prop in obj)
    {
        if (obj.hasOwnProperty(prop))
        {
            var key = parseInt(prop, 10);
            var value = obj[prop];
            if (typeof value === "object")
            {
                value = parse_obj(value);
            }
            array[key] = value;
        }
    }
    return array;
}

http://jsfiddle.net/shaggyfrog/DFnnm/

答案 3 :(得分:0)

这对我有用:

var obj = JSON.parse('{"1":"a","7":"something","3":{"1":"blah"}}');
var keys = Object.keys(obj).sort();

// Make obj look like it's an array by taking the highest value
// key and using it to give obj a length property.
obj.length = parseInt( keys[keys.length] ) + 1;

var arr = Array.prototype.slice.call(obj, 0);

arr现在看起来像这样:

[undefined, "a", undefined, Object, undefined, undefined, undefined, "something"]

好的,所以它没有将'内部'JSON对象转换为数组,但是快速递归循环执行与上面相同的操作应该将其排序。