Bash 解析 JSON 对象 jsawk
Bash Parse JSON Objects 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
},
...
}
由于连字符,f709f9c0b-on-0
不是有效的标识符,因此您不能使用点表示法。这可能有效(未经测试)
... | jsawk 'return this["f709f9c0b-on-0"].name'
我没有jsawk,但是jq可以这样做:
... | jq '.["f709f9c0b-on-0"].name'
只为世界其他地方。
我通过创建一个处理问题的 .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")
}
我希望这对某人有所帮助。
我正在尝试解析一些 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
},
...
}
f709f9c0b-on-0
不是有效的标识符,因此您不能使用点表示法。这可能有效(未经测试)
... | jsawk 'return this["f709f9c0b-on-0"].name'
我没有jsawk,但是jq可以这样做:
... | jq '.["f709f9c0b-on-0"].name'
只为世界其他地方。 我通过创建一个处理问题的 .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")
}
我希望这对某人有所帮助。