2013-04-29 113 views
1

由于我不明白的原因,我需要解析出来的web服务的JSON格式数据不在nme值对中。 '为简单起见,为了减少开销'返回的JSON似乎是一种可以与python eval一起使用的格式,但据我所知,不能用javascript(注意,我的javascript很差,所以我可能会错 - php等,很好!JS,没有这么多)在python'List of lists'格式中遍历'JSON Array of Array''

所以返回的数据为:

[[0, 'OK'], 
[['ITEM10314', ['ITEM10397']], 
    ['ITEM10315', ['cornflower']], 
    ['ITEM10397', ['ITEM10315']], 
    ['ITEM10514', ['ITEM10397']], 
    ['ITEM003', []], 
    ['ITEM004', []], 
    ['servertest', ['ITEM004', 'ITEM003']], 
    ['serverroot', []]]] 

(如果你有兴趣,这是从MKLiveStatus为Nagios的LQL主机查询

回复)第一个数组是状态,那么随后的数组由在nagios中监视的主机和主机的父级(在内部数组中)组成。

不错,不是吗。但我需要将它转化为体面的键/值对,并且必须有比编写我自己的解析器更好的方法(不仅仅是因为这是一个数据输出,而且还有几个类似的格式)。

我试图保持这一切在本机js,但如果有一个简单的jQuery方法,那么我很容易导致懒惰。不需要担心旧浏览器,我不在乎,这个项目最终会使用d3.js,它无论如何都不适用于旧浏览器。

有什么建议吗?在这种情况下,深度不会低于它所在的位置,所以至少是已知的。但是,我不能将它弄平,我需要知道主持人之后有哪个父母。

我在这里看到了一些python-js链接,但是在列表中没有任意未知大小的列表。

+0

我觉得一个自定义的解析器是他们的自定义多维数组转换成一个对象的唯一途径 – Xotic750 2013-04-29 22:48:19

+0

如果它不是在JS对象符号,它不是(根据定义)JSON。 – 2013-04-29 22:52:05

+0

@rick - 所有的JSON都是JS,但并非所有的JS都是JSON。显示的代码是有效的js。 – dandavis 2013-04-30 00:49:45

回答

0

像这样的事情应该去做

var data = [ 
    [0, "OK"], 
    [ 
     ["ITEM10314", ["ITEM10397"]], 
     ["ITEM10315", ["cornflower"]], 
     ["ITEM10397", ["ITEM10315"]], 
     ["ITEM10514", ["ITEM10397"]], 
     ["ITEM003", []], 
     ["ITEM004", []], 
     ["servertest", ["ITEM004", "ITEM003"]], 
     ["serverroot", []] 
    ] 
]; 

function parse(array) { 
    var object = { 
      ok: 1 
     }; 

    if (!Array.isArray(array) && array[0][0] !== 0 && array[0][1] !== "OK") { 
     return object; 
    } 

    object.ok = 0; 
    array[1].forEach(function (element) { 
     object[element[0]] = element[1]; 
    }); 

    return object; 
} 

console.log(parse(data)); 

jsfiddle

+1

应该是一个评论 – 2013-04-29 22:52:21

+0

我不能把它作为评论格式化,需要OP在他的问题中更新它或者具有正确权力水平的人。 – Xotic750 2013-04-29 22:53:26

+0

我标记了它的主持人帮助。 – Xotic750 2013-04-29 22:59:32