2017-07-27 229 views
0

我想檢索「opening_hour」對象並解析「open_now」數組。但由於某種原因,我無法做到這一點,可能是我的解析層次結構是錯誤的。有人可以建議,它應該如何。下面是我的JSON鏈接:無法解析嵌套的JSON對象

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=12.9647254,77.7191899&radius=500&name=cafe&key=AIzaSyD_kA7xtNYffQNlykVkVGk5ZNQgQtZFZTk

if (status == 200) { 
       HttpEntity entity = response.getEntity(); 
       String data = EntityUtils.toString(entity); 

       JSONObject jsono = new JSONObject(data); 
       JSONArray jarray = jsono.getJSONArray("results"); 

       for (int i = 0; i < jarray.length(); i++) { 
        JSONObject object = jarray.getJSONObject(i); 

        Elements parameters = new Elements(); 

        parameters.setTitle(object.getString("name")); 
        parameters.setImage(object.getString("icon")); 

        elementList.add(parameters); 
       } 

       JSONArray jarraytwo = jsono.getJSONArray("opening_hours"); 

       for (int i = 0; i < jarraytwo.length(); i++) { 
        JSONObject objecttwo = jarraytwo.getJSONObject(i); 

        Elements parameterstwo = new Elements(); 

        parameterstwo.setAuthor(objecttwo.getString("open_now")); 

        Toast.makeText(getApplicationContext(), "open_now : " + objecttwo.getString("open_now"), Toast.LENGTH_LONG).show(); 

        elementListtwo.add(parameterstwo); 
       } 

       return true; 

這是愚蠢的問題,我知道,但我不知道嵌套的JSON解析的。下面是我完整的代碼和鏈接從那裏我傳遞

public class MainActivity extends AppCompatActivity { 

    private static final int REQ_CODE_SPEECH_INPUT = 100; 
    private TextView mVoiceInputTv; 
    private ImageButton mSpeakBtn; 

    private static final int PERMISSION_ACCESS_COARSE_LOCATION = 1; 
    private GoogleApiClient googleApiClient; 

    int status; 

    ArrayList<String> result; 

    ArrayList<Elements> elementList; 
    ArrayList<Elements> elementListtwo; 
    ElementAdaptor adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //mVoiceInputTv = (TextView) findViewById(R.id.voiceInput); 
     mSpeakBtn = (ImageButton) findViewById(R.id.btnSpeak); 
     mSpeakBtn.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       startVoiceInput(); 
      } 
     }); 

    } 

    private void startVoiceInput() { 
     Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
     intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
     intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault()); 
     intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Welcome to Harman Framework"); 
     try { 
      startActivityForResult(intent, REQ_CODE_SPEECH_INPUT); 
     } catch (ActivityNotFoundException a) { 

     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     switch (requestCode) { 
      case REQ_CODE_SPEECH_INPUT: { 
       if (resultCode == RESULT_OK && null != data) { 
        result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 
        //mVoiceInputTv.setText(result.get(0)); 
        Toast.makeText(getApplicationContext(), "You searched : " + result.get(0), Toast.LENGTH_LONG).show(); 

        elementList = new ArrayList<Elements>(); 

        new JSONAsyncTask().execute("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670,151.1957&radius=500&types=food&name=" + result.get(0) + "&key=AIzaSyD_kA7xtNYffQNlykVkVGk5ZNQgQtZFZTk"); 

        ListView listview = (ListView)findViewById(R.id.list); 
        adapter = new ElementAdaptor(getApplicationContext(), R.layout.row, elementList); 

        listview.setAdapter(adapter); 

        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

         @Override 
         public void onItemClick(AdapterView<?> arg0, View arg1, int position, 
               long id) { 
          Intent intent = new Intent(getApplicationContext(), DescriptionActivity.class); 
          intent.putExtra("title", elementList.get(position).getTitle()); 
          intent.putExtra("author", elementList.get(position).getAuthor()); 
          intent.putExtra("publishedat", elementList.get(position).getPublishedat()); 
          intent.putExtra("description", elementList.get(position).getDescription()); 
          intent.putExtra("imageurl", elementList.get(position).getImage()); 
          startActivity(intent); 
         } 
        }); 

       } 
       break; 
      } 

     } 
    } 

    //String url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670,151.1957&radius=500&types=food&name=" + result.get(0) + "&key=AIzaSyD_kA7xtNYffQNlykVkVGk5ZNQgQtZFZTk"; 

    class JSONAsyncTask extends AsyncTask<String, Void, Boolean> { 

     ProgressDialog dialog; 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      dialog = new ProgressDialog(MainActivity.this); 
      dialog.setMessage("Loading......."); 
      dialog.setTitle("Connecting server"); 
      dialog.show(); 
      dialog.setCancelable(false); 
     } 

     @Override 
     protected Boolean doInBackground(String... urls) { 
      try { 

       HttpGet httppost = new HttpGet(urls[0]); 

       HttpParams httpParameters = new BasicHttpParams(); 

       HttpClient httpclient = new DefaultHttpClient(); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpParams params = httpclient.getParams(); 

       status = response.getStatusLine().getStatusCode(); 

       if (status == 200) { 
        HttpEntity entity = response.getEntity(); 
        String data = EntityUtils.toString(entity); 

        JSONObject jsono = new JSONObject(data); 
        JSONArray jarray = jsono.getJSONArray("results"); 

        for (int i = 0; i < jarray.length(); i++) { 
         JSONObject object = jarray.getJSONObject(i); 

         Elements parameters = new Elements(); 

         parameters.setTitle(object.getString("name")); 
         parameters.setImage(object.getString("icon")); 

         elementList.add(parameters); 

        } 
        return true; 
       } 

      } catch (JSONException e3) { 
       e3.printStackTrace(); 
      } catch (IOException e2) { 
       e2.printStackTrace(); 
      } 

      return false; 
     } 

     protected void onPostExecute(Boolean result) { 
      dialog.cancel(); 
      adapter.notifyDataSetChanged(); 
      if(result == false) 
       Toast.makeText(getApplicationContext(), "Unable to fetch data from server", Toast.LENGTH_LONG).show(); 

     } 
    } 
} 
+0

這對於你的問題並不明確,以獲得'opening_hour',但我會優先使用提供的客戶端lib的API服務。 https://developers.google.com/maps/web-services/client-library – Fusselchen

回答

1

您需要嵌套的for循環相互轉化。看看你的JSON文件的結構:你有你的jarray,這是一個JSON對象數組。數組中的每個JSON對象都有自己的開放時間。所以,你要事端這樣的:

for (int i = 0; i < jarray.length(); i++) { 
    JSONObject object = jarray.getJSONObject(i); 

    Elements parameters = new Elements(); 

    parameters.setTitle(object.getString("name")); 
    parameters.setImage(object.getString("icon")); 

    elementList.add(parameters); 

    // Get opnening hours for current result 
    JSONObject curOpeningHours = object.getJSONObject("opening_hours"); 
    hoursList.push(curOpeningHours); 

    String openNow = curOpeningHours.getString("open_now"); 
    // Do something... 

} 

它沒有進行測試,但它應該給你一個想法

0

使用嵌套的JSONObject

 JSONArray jarray = jsono.getJSONArray("results"); 
      for (int i = 0; i < jarray.length(); i++) { 
       JSONObject object = jarray.getJSONObject(i); 
       JSONArray jarray1 = object.getJSONArray("opening_hours"); 
      for (int j = 0; j < jarray1.length(); j++) { 
       JSONObject object2 = jarray1.getJSONObject(j);       
       parameters.setOpenNow(object2.getString("open_now"));     
      } 
      } 
0

解析複雜的JSON或當我不會用的JSONObject可言,如果JSON至少包含一組對象。 改爲使用google-gson

使用gson,你可以用更少的代碼和精力來序列化/反序列化你的json。

我會首先創建一個java類,它表示您試圖解析的相同的json方案。

例如,試圖解析此JSON字符串:

[ 
{ 
    "FirstName": "What", 
    "LastName": "Ever" 
}, 
{ 
    "FirstName": "John", 
    "LastName": "Snow" 
} 
] 

在Java代碼中,我將首先創建一個類:

public class Person { 
    public String FirstName; 
    public String LastName; 
} 

我們解析JSON:

Gson gson = new Gson(); 
List<Person> people = gson.fromJson("Json string here", new TypeToken<List<Person>>() {}.getType()); 

現在你可以簡單地在列表上做一個循環,並找到約翰·斯諾。