2016-04-06 9 views
0

Я пытаюсь проанализировать результат Json с URL-адресом (эмулятор Philips Hue в этом случае) в JsonArray в Android Studio. У меня есть следующий код до сих пор:String to JSONArray в Java

String jsonString = serviceHandler.makeServiceCall(BASE_URL, ServiceHandler.GET); 
JSONArray lights; 

if (jsonString != null) { 
     try { 
      JSONObject jsonObject = new JSONObject(jsonString); 

      lights = jsonObject.getJSONArray("lights"); 

      for (int i = 0; i < lights.length(); i++) { 
       JSONObject l = lights.getJSONObject(i); 

       String name = l.getString("name"); 
       String bri = l.getString("bri"); 
       String hue = l.getString("hue"); 
       String sat = l.getString("sat"); 
       String status = l.getString("on"); 
      } 
     } catch (JSONException ex) { 
      ex.printStackTrace(); 
     } 
    } else { 
     Log.e("ServiceHandler", "Cannot get data from the url"); 
    } 

Но, когда я пытаюсь запустить этот код я получаю (...)

типа org.json.JSONObject не может быть преобразован в JSONArray

погрешность. Я пробовал другие способы конвертировать строку в JsonArray или прокручивать строку, но безуспешно.

Что я делаю неправильно ??

Edit: Данные jsonString:

{"lights":{"1":{"state":{"on":false,"bri":254,"hue":4444,"sat":254,"xy":[0.0,0.0],"ct":0,"alert":"none","effect":"none","colormode":"hs","reachable":true},"type":"Extended color light","name":"Hue Lamp 1","modelid":"LCT001","swversion":"65003148","uniqueid":"00:17:88:01:00:d4:12:08-0a","pointsymbol":{"1":"none","2":"none","3":"none","4":"none","5":"none","6":"none","7":"none","8":"none"}},"2":{"state":{"on":false,"bri":254,"hue":23536,"sat":144,"xy":[0.346,0.3568],"ct":201,"alert":"none","effect":"none","colormode":"hs","reachable":true},"type":"Extended color light","name":"Hue Lamp 2","modelid":"LCT001","swversion":"65003148","uniqueid":"00:17:88:01:00:d4:12:08-0b","pointsymbol":{"1":"none","2":"none","3":"none","4":"none","5":"none","6":"none","7":"none","8":"none"}},"3":{"state":{"on":true,"bri":254,"hue":65136,"sat":254,"xy":[0.346,0.3568],"ct":201,"alert":"none","effect":"none","colormode":"hs","reachable":true},"type":"Extended color light","name":"Hue Lamp 3","modelid":"LCT001","swversion":"65003148","uniqueid":"00:17:88:01:00:d4:12:08-0c","pointsymbol":{"1":"none","2":"none","3":"none","4":"none","5":"none","6":"none","7":"none","8":"none"}}},"schedules":{"1":{"time":"2012-10-29T12:00:00","description":"","name":"schedule","command":{"body":{"scene":null,"on":true,"xy":null,"bri":null,"transitiontime":null},"address":"/api/newdeveloper/groups/0/action","method":"PUT"}}},"config":{"portalservices":false,"gateway":"192.168.2.1","mac":"00:00:88:00:bb:ee","swversion":"01005215","linkbutton":false,"ipaddress":"192.168.178.31:5510","proxyport":0,"swupdate":{"text":"","notify":false,"updatestate":0,"url":""},"netmask":"255.255.255.0","name":"Philips hue","dhcp":true,"proxyaddress":"","whitelist":{"newdeveloper":{"name":"test user","last use date":"2016-04-06T16:51:26","create date":"2012-10-29T12:00:00"}},"UTC":"2012-10-29T12:05:00"},"groups":{"1":{"name":"Group 1","action":{"on":true,"bri":254,"hue":33536,"sat":144,"xy":[0.346,0.3568],"ct":201,"alert":null,"effect":"none","colormode":"xy","reachable":null},"lights":["1","2"]}},"scenes":{}} 
+0

Можете ли вы показать, что вы пытаетесь разобрать? –

+0

'lights' не является типом jsonarray post your json string –

+1

lights - это JSONObject, а не массив –

ответ

0

Проблема в том, что "lights" является n ot JSONArray, но JSONObject. Поэтому для извлечения содержимого "lights" вам необходимо выполнить итерацию по всем объектам "lights" с использованием метода keys().

Замените код с вашего блока try следующим кодом, чтобы перебрать все объекты внутри "lights".

JSONObject jsonObject = new JSONObject(jsonString); 
JSONObject lights = jsonObject.getJSONObject("lights"); 
Iterator<String> keyIterator = lights.keys(); 

while (keys.hasNext()) { 
    String key = keyIterator.next(); 
    JSONObject l = lights.getJSONObject(key); 

    String name = l.getString("name"); 
    String bri = l.getString("bri"); 
    String hue = l.getString("hue"); 
    String sat = l.getString("sat"); 
    String status = l.getString("on"); 
} 
+0

Да. Это трюк! – NVO

0

How to parse the JSON objects with each different key and value, using Java? посетить эту ссылку .. и там вы можете получить доступ к другому ключу и значение с этим. поэтому вам не нужно беспокоиться о ключе. и у вас есть клавиши типа «1» и «2» и так далее. поэтому просто перейдите через огни, и вы получите ответ. если у вас есть проблемы с этим, не стесняйтесь спрашивать.

JSONObject json = new JSONObject("<jsonString>"); 
Iterator<String> keys = json.keys(); 

while (keys.hasNext()) { 
    String key = keys.next(); 
    System.out.println("Key :" + key + " Value :" + json.get(key)); 
} 

Из этого вы получите ключ, и после этого вы должны просто получить значения этого объекта.

1

ключ «огни» карты к JSONObject и вы преобразования его в JSONArray отсюда exception.Change линии

lights = jsonObject.getJSONArray("lights"); 

в

JSONObject lights = jsonObject.getJSONObject("lights"); 
0

Следующий код должен работать для вас :

String jsonString = serviceHandler.makeServiceCall(BASE_URL, ServiceHandler.GET); 

if (jsonString != null) { 
    try { 
     JSONObject jsonObject = new JSONObject(jsonString); 


     for (int 1 = 1; i <= 3; i++) { 
      JSONObject l = jsonObject.getJSONObject("lights").getJSONObject(Integer.toString(i)); 

      String name = l.getString("name"); 
      String bri = l.getString("bri"); 
      String hue = l.getString("hue"); 
      String sat = l.getString("sat"); 
      String status = l.getString("on"); 
     } 
    } catch (JSONException ex) { 
     ex.printStackTrace(); 
    } 
} else { 
    Log.e("ServiceHandler", "Cannot get data from the url"); 
} 
0

В ваших JSONObject каждый ключ карты к JSONObject не к JSONArray. Таким образом, вы должны прочитать как это от вашего JSONObject

JSONObject lights = jsonObject.getJSONObject("lights"); 

JSONObject schedules = jsonObject.getJSONObject("schedules"); 

JSONObject config = jsonObject.getJSONObject("config"); 

JSONObject groups = jsonObject.getJSONObject("groups"); 

JSONObject scenes = jsonObject.getJSONObject("scenes"); 

Надеется, что это поможет вам.