1

由于我不明白的原因,我需要解析的来自 web 服务的 JSON 格式数据不在 nme 值对中。“为了简单起见并减少开销”返回的 JSON 似乎是一种适用于 python eval 的格式,但据我所知,不适用于 javascript(警告,我的 javascript 很差,所以我可能是错的 - php 等,很好.js,没那么多!)

所以数据返回为:

[[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 链接,但没有在列表中看到任意未知大小的列表。

4

1 回答 1

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 上

于 2013-04-29T22:52:06.163 回答