2015-05-28 2 views
-3

Я пытаюсь подключиться к ссылке Api, читать и строить все значения в списке объектов.Android java type org.json.JSONObject не может быть преобразован в JSONArray

Я вызываю AsyncTask из своего деятельности. Я проверил значения списка, и все они верны.

watchlistByDB_AsyncTask watchlistByDB_AsyncTask = new watchlistByDB_AsyncTask(list, this); 
watchlistByDB_AsyncTask.setItemListToListings(this); 
watchlistByDB_AsyncTask.execute(); 

watchlistByDB_AsyncTask:

public class watchlistByDB_AsyncTask extends AsyncTask<Void, watchlist_root, Void> { 

    JSONObject Jo_result; 
    itemListToListings itemListToListings; 
    Context context; 
    List<DB_constr> items; 

    public watchlistByDB_AsyncTask(List<DB_constr> items, Context context) { 
     this.items = items; 
     this.context = context; 
    } 



    public void setItemListToListings (itemListToListings itemListToListings) { 
     this.itemListToListings = itemListToListings; 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     for(int i = 0; i < items.size(); i++){ 
      String url = "http://www.gw2spidy.com/api/v0.9/json/item/" + items.get(i).getItemID(); 
      publishProgress(JoToJO_constructor(spidyHttpGetRequest(url))); 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(watchlist_root... iacs) { 
     super.onProgressUpdate(iacs); 
     if (iacs[0] != null) { 
      itemListToListings.itemListToListings(iacs[0]); 
     } else { 
      Log.i("gw2Log", "null"); 
     } 
    } 

    public JSONObject spidyHttpGetRequest(String URL){ 
     try { 
      HttpGet get = new HttpGet(URL); 
      HttpClient client = new DefaultHttpClient(); 
      HttpResponse response = client.execute(get); 
      HttpEntity entity = response.getEntity(); 
      String result = EntityUtils.toString(entity); 
      Jo_result = new JSONObject(result); 

     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return Jo_result; 
    } 



    public watchlist_root JoToJO_constructor(JSONObject Jo_result) { 
     watchlist_root spidy_iTN_rootO = new watchlist_root(); 
     try { 

      JSONArray list = new JSONArray(Jo_result.getString("result")); 

      for (int i = 0; i < list.length(); i++) { 
       JSONObject resultsObject = list.getJSONObject(i); 
       watchlist_result spidy_iTN_resultsO = new watchlist_result(); 

       spidy_iTN_resultsO.setData_id(resultsObject 
         .getString("data_id")); 
       spidy_iTN_resultsO.setName(resultsObject 
         .getString("name")); 
       spidy_iTN_resultsO.setRarity(resultsObject 
         .getInt("rarity")); 
       spidy_iTN_resultsO.setRestriction_level(resultsObject 
         .getInt("restriction_level")); 
       spidy_iTN_resultsO.setImg(resultsObject 
         .getString("img")); 
       spidy_iTN_resultsO.setType_id(resultsObject 
         .getInt("type_id")); 
       spidy_iTN_resultsO.setSub_type_id(resultsObject 
         .getInt("sub_type_id")); 
       spidy_iTN_resultsO.setPrice_last_changed(resultsObject 
         .getString("price_last_changed")); 
       spidy_iTN_resultsO.setMax_offer_unit_price(resultsObject 
         .getString("max_offer_unit_price")); 
       spidy_iTN_resultsO.setMin_sale_unit_price(resultsObject 
         .getString("min_sale_unit_price")); 
       spidy_iTN_resultsO.setOffer_availability(resultsObject 
         .getInt("offer_availability")); 
       spidy_iTN_resultsO.setSale_availability(resultsObject 
         .getInt("sale_availability")); 
       spidy_iTN_resultsO.setSale_price_change_last_hour(resultsObject 
         .getInt("sale_price_change_last_hour")); 
       spidy_iTN_resultsO.setOffer_price_change_last_hour(resultsObject 
         .getInt("offer_price_change_last_hour")); 
       spidy_iTN_rootO.addObject(spidy_iTN_resultsO); 
      } 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return spidy_iTN_rootO; 
    } 

    public interface itemListToListings { 
     public void itemListToListings(watchlist_root resultClass); 
    } 
} 

При попытке запустить этот код, я получаю ошибку на

line 88: JSONArray list = new JSONArray(Jo_result.getString("result")); 

org.json.JSONException: Value {"data_id":9586,"name":"18 Slot Mithril Box","rarity":1,"restriction_level":0,"img":"https:\/\/render.guildwars2.com\/file\/00A876DFF0B89D18026B9BE4C1239E0BB7BAB81E\/220595.png","type_id":2,"sub_type_id":0,"price_last_changed":"2015-05-28 20:52:14 UTC","max_offer_unit_price":20800,"min_sale_unit_price":26300,"offer_availability":1106,"sale_availability":465,"sale_price_change_last_hour":0,"offer_price_change_last_hour":0,"result_of":[{"recipe_id":511,"name":"18 Slot Mithril Box"}]} of type org.json.JSONObject cannot be converted to JSONArray 
05-28 21:28:35.596 25726-25742/? W/System.err﹕ at org.json.JSON.typeMismatch(JSON.java:111) 
05-28 21:28:35.596 25726-25742/? W/System.err﹕ at org.json.JSONArray.<init>(JSONArray.java:96) 
05-28 21:28:35.596 25726-25742/? W/System.err﹕ at org.json.JSONArray.<init>(JSONArray.java:108) 
05-28 21:28:35.596 25726-25742/? W/System.err﹕ at com.example.krijn.gw2TP_androidMobile.AsyncTasks.watchlistByDB_AsyncTask.JoToJO_constructor(watchlistByDB_AsyncTask.java:88) 
05-28 21:28:35.596 25726-25742/? W/System.err﹕ at com.example.krijn.gw2TP_androidMobile.AsyncTasks.watchlistByDB_AsyncTask.doInBackground(watchlistByDB_AsyncTask.java:47) 
05-28 21:28:35.596 25726-25742/? W/System.err﹕ at com.example.krijn.gw2TP_androidMobile.AsyncTasks.watchlistByDB_AsyncTask.doInBackground(watchlistByDB_AsyncTask.java:25) 

Погрешность сама объясняет вполне самостоятельно, но я не знаю, почему его существо называется. This is one of the links, который показывает, что это массив JSON. Я попытался добавить каждое свойство как JSONObject в состояние ошибки, но тогда он не знал ни одного из свойств структуры.

+0

'показывает, что это массив JSON' no it does not. Единственный массив находится в 'result_of', а не' result' – njzk2

+0

вы запрашиваете для одного элемента (как указано идентификатором элемента в пути.) Почему вы ожидаете массив? Здесь есть только один результат. – njzk2

ответ

0

Вы попробовали дооснащение? это было бы намного проще для вас. Это ручка Get/Post запрос & Deserialize JSON в Java объекты с GSON

square.github.io/retrofit/

2

Изменить JSONArray list = new JSONArray(Jo_result.getString("result"));

Для JSONObject list = new JSONObject(Jo_result.getString("result"));

Ваша строка, заключенная между {}, что делает его объектом.

Имейте в виду, это

{} = JSon Объект

[] = Json Массив

UPDATE

Когда вы сделаете это

JSONObject resultsObject = list.getJSONObject(i);

он ожидал другого объекта в пределах основного объекта, например:

{ // <-- main object 

    i : { <-- object failing 
    // ... 
    } 

} 

Вот что ожидает код, где я от петли, но не существует, и к тому же это, ключ должен быть строкой, например

{ // <-- main object 

    string : { 
    // ... 
    } 

} 

Итак, что я рекомендую вам: удалить для цикла, поскольку он вам больше не нужен и вызывает переменные внутри json, как это list.getString("data_id"), так как это list, который содержит ваш json-объект.

Надеюсь, это поможет.

+0

Это звучит логично, спасибо за ваш ответ! Теперь я получаю сообщение об ошибке в следующем 'JSONObject resultsObject = list.getJSONObject (i);' say. 'getJSONObject (java.lang.string) в JSONObject нельзя применить к (int)' –

+0

Я отредактировал свой ответ. Если он работает, пожалуйста, примите его в качестве ответа (проклятая репутация: P) –

Смежные вопросы