Bash解析JSON对象jsawk

时间:2016-02-24 20:16:18

标签: json bash shell jsawk

我正在尝试解析一些JSON,它是Philips Hue API的输出。

我找到了工具 jsawk ,但不知怎的,我无法访问JSON对象中的数据。

命令:

... | jsawk 'return this.f709f9c0b-on-0.name'

有效,但不幸的是我没有每个对象的ID(例如f709f9c0b-on-0)。有没有办法在不知道ID的情况下访问对象,然后找出该ID。我试图使用“*”或对象的迭代,但没有任何工作。

提前致谢

输出如下所示:

{
    "f709f9c0b-on-0": {
        "name": "Badezimmer on 0",
        "lights": [
            "4"
        ],
        "owner": "3e281978544fb15b42bc0e3a3f4ce3",
        "recycle": true,
        "locked": false,
        "appdata": {},
        "picture": "",
        "lastupdated": "2016-02-17T17:20:06",
        "version": 1
    },
    "69d313be0-on-0": {
        "name": "Klavier on 0",
        "lights": [
            "1"
        ],
        "owner": "3e281978544fb15b42bc0e3a3f4ce3",
        "recycle": true,
        "locked": false,
        "appdata": {},
        "picture": "",
        "lastupdated": "2016-02-17T17:31:05",
        "version": 1
    },
...
}

2 个答案:

答案 0 :(得分:0)

由于连字符,

f709f9c0b-on-0不是有效的标识符,因此您无法使用点表示法。这可能有用(未经测试)

... | jsawk 'return this["f709f9c0b-on-0"].name'

我没有jsawk,但可以这样做:

... | jq '.["f709f9c0b-on-0"].name'

答案 1 :(得分:0)

仅适用于世界其他地区。 我通过创建一个处理问题的.jar解决了这个问题。我觉得在Java中比在bash中更容易做到这一点。

我使用了这个JSON类:https://github.com/stleary/JSON-java 只需下载文件,创建包org.json即可。

适用于我的Java代码是:

String JSON = "your JSON";
JSONObject jsonObject = new JSONObject(JSON);
    ArrayList<ArrayList<String>> keyArray = new ArrayList<>();
    Iterator<String> keys = jsonObject.keys(); //get all JSON keys

    while (keys.hasNext()) { //for all keys do...
        String key = (String) keys.next(); //get Current Key
       //Now you can access the Object in the Object with: 
jsonObject.getJSONObject(key).getString("name")
    }

我希望这有助于某人。