2016-02-24 3 views
3

Я пытаюсь разобрать JSON, который является выходом API-интерфейса Philips Hue.Bash Parse JSON Objects jsawk

Я нашел инструмент jsawk, но каким-то образом я не могу получить доступ к данным внутри объекта JSON.

Команда:

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

работает, но, к сожалению, у меня нет идентификатор каждого объекта (например, f709f9c0b-на-0). Есть ли способ получить доступ к объекту, не зная идентификатор, а затем узнать этот идентификатор. Я пытался использовать «*» или «Итерации» объектов, но ничего не работало.

Заранее спасибо

Выход выглядит следующим образом:

{ 
    "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 
    }, 
... 
} 

ответ

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") 
    } 

Я надеюсь, что это поможет кому-то.

0

f709f9c0b-on-0 не является допустимым идентификатором в связи с дефисом, поэтому вы не можете использовать точечную нотацию. Это может работать (непроверенные)

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

Я не jsawk, но может сделать это следующим образом:

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

Спасибо или ответ. На самом деле работает точечная нотация. Моя проблема ist, что у меня нет идентификатора. Мне нужна переменная для «f709f9c0b-on-0». Идентификатор генерируется случайным образом, поэтому я не могу воспроизвести это. Мне нужно что-то, что итерации через все объекты JSON. Это возможно? – Marcel

+0

Возможно, вам понадобится использовать что-то вроде 'forEach (this.keys(), ...)' –