2013-05-03 3 views
1

Так что, пытаясь выяснить самый эффективный способ разобрать следующий URL JSON, я буду делать это в Java на Android.Лучший способ разбора JSONObjects и JSONArrays

JSONParser.java

public class JSONParser { 

private static final Context context = null; 
static InputStream is = null; 
static JSONObject jarray = null; 
static JSONArray jarray2 = null; 
static String json = ""; 

// constructor 
public JSONParser() { 

} 
public JSONObject getJSONFromUrl2(String url) { 

     StringBuilder builder = new StringBuilder(); 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(url); 
     try { 
      HttpResponse response = client.execute(httpGet); 
      StatusLine statusLine = response.getStatusLine(); 
      int statusCode = statusLine.getStatusCode(); 
      if (statusCode == 200) { 
      HttpEntity entity = response.getEntity(); 
      InputStream content = entity.getContent(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(content)); 
      String line; 
      while ((line = reader.readLine()) != null) { 
       builder.append(line); 
      } 
       //Recommended by Ted Hopp 
       return new JSONObject(builder.toString()); 
      } else { 
      Log.e("==>", "No Response, Check Your API KEY"); 
      Toast.makeText(context,"Error Response, Check your API Key", Toast.LENGTH_LONG).show(); 
      } 
     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     } catch (JSONException e) { 
     Log.e("JSON Parser Activity", url + e.toString()); 
    } 
    // return JSON String 
    return null; 
} 

Теперь Главный ВЫПУСКА им того как разборе JSONObject с помощью части 2 моего JSONParser деятельности.

https://api.company.com/api/systems/165756/summary?&key=e1e63de7276b04c9bb99adfd45b3a14c

возвращает следующий JSON

{ 
    "energy_month": 31132, 
    "current_power": 1963, 
    "modules": 24, 
    "energy_today": 1577, 
    "system_id": 165756, 
    "energy_week": 215504, 
    "source": "microinverters", 
    "energy_lifetime": 1545467, 
    "summary_date": "2013-05-03T00:00:00-07:00" 
} 

    protected ArrayList<String> doInBackground(final String... args) { 

      JSONParser jParser = new JSONParser(); 
      arrfortextviews=new ArrayList<String>(); 
      JSONObject json2 = jParser.getJSONFromUrl2(https://api.company.com/api/systems/165756/summary?&key=e1e63de7276b04c9bb99adfd45b3a14c); 
        //Added due to for some reason index return has more than 1 
     for (int i = 0; i < json2.length(); i++) { 
         try {      
        Log.e("JSON Parser", summary + args.toString()); 
        String current_power = json2.getString(TAG_CURRENT_POWER); 
        String energy_lifetime = json2.getString(TAG_ENERGY_LIFETIME); 

Однако с этим текущего кода я получаю следующее сообщение об ошибке.

05-03 11:31:59.765: E/JSON - Parsing of Object 2nd Time in SummaryData.java(30625): {"energy_lifetime":1545467,"energy_today":12748,"current_power":4227,"energy_month":31132,"source":"microinverters","summary_date":"2013-05-03T00:00:00-07:00","energy_week":215504,"system_id":165756,"modules":24}[Ljava.lang.String;@41dfecd0 
05-03 11:31:59.765: E/JSON - Parsing of Object 2nd Time in SummaryData.java(30625): {"energy_lifetime":1545467,"energy_today":12748,"current_power":4227,"energy_month":31132,"source":"microinverters","summary_date":"2013-05-03T00:00:00-07:00","energy_week":215504,"system_id":165756,"modules":24}[Ljava.lang.String;@41dfecd0 
05-03 11:31:59.780: E/JSON - Parsing of Object 2nd Time in SummaryData.java(30625): {"energy_lifetime":1545467,"energy_today":12748,"current_power":4227,"energy_month":31132,"source":"microinverters","summary_date":"2013-05-03T00:00:00-07:00","energy_week":215504,"system_id":165756,"modules":24}[Ljava.lang.String;@41dfecd0 
05-03 11:31:59.780: E/JSON - Parsing of Object 2nd Time in SummaryData.java(30625): {"energy_lifetime":1545467,"energy_today":12748,"current_power":4227,"energy_month":31132,"source":"microinverters","summary_date":"2013-05-03T00:00:00-07:00","energy_week":215504,"system_id":165756,"modules":24}[Ljava.lang.String;@41dfecd0 
05-03 11:31:59.785: E/JSON - Parsing of Object 2nd Time in SummaryData.java(30625): {"energy_lifetime":1545467,"energy_today":12748,"current_power":4227,"energy_month":31132,"source":"microinverters","summary_date":"2013-05-03T00:00:00-07:00","energy_week":215504,"system_id":165756,"modules":24}[Ljava.lang.String;@41dfecd0 
05-03 11:31:59.785: E/JSON - Parsing of Object 2nd Time in SummaryData.java(30625): {"energy_lifetime":1545467,"energy_today":12748,"current_power":4227,"energy_month":31132,"source":"microinverters","summary_date":"2013-05-03T00:00:00-07:00","energy_week":215504,"system_id":165756,"modules":24}[Ljava.lang.String;@41dfecd0 
05-03 11:31:59.790: E/JSON - Parsing of Object 2nd Time in SummaryData.java(30625): {"energy_lifetime":1545467,"energy_today":12748,"current_power":4227,"energy_month":31132,"source":"microinverters","summary_date":"2013-05-03T00:00:00-07:00","energy_week":215504,"system_id":165756,"modules":24}[Ljava.lang.String;@41dfecd0 
05-03 11:31:59.790: E/JSON - Parsing of Object 2nd Time in SummaryData.java(30625): {"energy_lifetime":1545467,"energy_today":12748,"current_power":4227,"energy_month":31132,"source":"microinverters","summary_date":"2013-05-03T00:00:00-07:00","energy_week":215504,"system_id":165756,"modules":24}[Ljava.lang.String;@41dfecd0 
05-03 11:31:59.790: E/JSON - Parsing of Object 2nd Time in SummaryData.java(30625): {"energy_lifetime":1545467,"energy_today":12748,"current_power":4227,"energy_month":31132,"source":"microinverters","summary_date":"2013-05-03T00:00:00-07:00","energy_week":215504,"system_id":165756,"modules":24}[Ljava.lang.String;@41dfecd0 
05-03 11:31:59.895: E/SpannableStringBuilder(30625): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 
05-03 11:31:59.895: E/SpannableStringBuilder(30625): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 
+0

Я рекомендовал бы против разбора JSON в одной и той же задачи асинхронным, который был сделан запрос. Слой между ответом AsyncTask и вашей активностью может иметь более мелкозернистую обработку ошибок, повторное использование кода во всех запросах и ведение журнала для таких вещей, как проблемы с подключением, ошибки сервера, ошибки анализа JSON и т. Д. –

+0

@iambmelton Я обновил свой код - взяв второй взгляд –

ответ

1

Посмотрите на класс JSONObject. Это часть стандартной дистрибуции Android. Код может быть столь же простым, как:

JSONObject thing = new JSONObject(jsonString); 

Тогда вам просто необходимо для навигации по структуре объектного thing, чтобы добраться до данных вам нужно.

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

public JSONObject getJSONFromUrl2(String url) { 
    StringBuilder builder = new StringBuilder(); 
    HttpClient client = new DefaultHttpClient(); 
    HttpGet httpGet = new HttpGet(url); 
    try { 
     HttpResponse response = client.execute(httpGet); 
     StatusLine statusLine = response.getStatusLine(); 
     int statusCode = statusLine.getStatusCode(); 
     if (statusCode == 200) { 
      HttpEntity entity = response.getEntity(); 
      InputStream content = entity.getContent(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(content)); 
      String line; 
      while ((line = reader.readLine()) != null) { 
       builder.append(line); 
      } 
      return new JSONObject(builder.toString()); 
     } else { 
      Log.e("==>", "No Response, Check Your API KEY"); 
      Toast.makeText(context,"Error Response, Check your API Key", Toast.LENGTH_LONG).show(); 
     } 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
     Log.e("JSON Parser", json + url + e.toString()); 
    } 
    return null; // only gets here on an error 
} 

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

+0

Спасибо за ответ, у меня есть работа JSONParser, использующая, я опубликовал выше. Теперь проблема im im не в состоянии проанализировать JSONObject со второй частью моего действия JSONParser, используя 'getJSONFromUrl2' вместо' getJSONFromUrl' –

+0

@JaisonBrooksDevelopment. Кажется, вы прокомментировали код, который выполняет синтаксический анализ. Почему вы не можете разобрать объект? Вы пробовали просто «вернуть новый JSONObject (builder.toString()); в блоке 'try'? –

+0

ли вы имеете в виду что-то вроде этого ' \t \t попытки {\t \t \t \t // JSONObject jobj2 = новый JSONObject (builder.toString()); \t \t \t вернуть новый JSONObject (builder.toString()); \t \t \t // jarray = jobj2.getJSONObject ("Резюме"); \t \t} поймать (JSONException е) { \t \t} \t \t // вернуть JSON строку \t \t возвращение jobj2; ' –

1

Вы можете использовать библиотеку Volley, предоставленную Google.
У этого есть много преимуществ, таких как кеширование, управление памятью и запрос на очередность.
Вы можете найти одно лучшее решение здесь:
http://www.androidhive.info/2014/05/android-working-with-volley-library-1/

+0

Спасибо за этот ресурс. Я нашел решение некоторое время назад, используя GSON. Но Volley звучит так, как будто это действительно хорошо использовать. У вас был большой опыт? –

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