2012-06-20 14 views
22
HttpClient httpclient = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost("http://my.server:8080/android/service.php"); 


List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
nameValuePairs.add(new BasicNameValuePair("action", "getjson")); 
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

HttpResponse response = httpclient.execute(httppost); 

service.php generuje ciąg json. Jak mogę pobrać go z mojego response? Btw; Przeanalizowałem bibliotekę GSON, czy mogę wykorzystać w niej jakieś metody?get json z HttpResponse

Rozwiązania podobne do tego wygląda bardzo brzydki, imo: best way to handle json from httpresponse android

Istnieje wiele sposobów być lepiej, prawda?

Każda pomoc jest mile widziana, dzięki


Aktualizacja:

String json = EntityUtils.toString(response.getEntity()); 

wydaje rade. Jest tylko jeden mały problem: Ciąg jest zawijany nawiasami []. Czy powinienem je usunąć ręcznie? Są one generowane przez php: s json_encode()

+1

Nawiasy oznaczają tablicę JSON. Powinieneś przetworzyć odpowiedź jako taką. – Perception

+0

@Percepcja poprawna. Usunąłem tablicę kontenerów z kodu php i rozwiązałem problem. Dzięki – Johan

+0

@Johan Czy mógłbyś opublikować swoją odpowiedź i zaakceptować ją, aby inni mogli ją uznać za przydatną i wiedzieć, co dokładnie rozwiązało problem. Dzięki! –

Odpowiedz

1

Problem był w moim pliku php. Usunięcie tablicy kontenerów z zakodowanego obiektu json spowodowało, że mój kod java działał.

0

Jeśli Wracam ciąg JSON z mojego serwisu WWW, zazwyczaj chcą dostać go z powrotem do obiektu JSON tak:

String response = client.getResponse(); 

    if (responseCode == 200) 
    {     
     JSONObject obj = new JSONObject(response);                
    } 
+0

Wygląda czystsze, dzięki za wejście. Jednak problem był związany z php, zobacz mój komentarz powyżej. – Johan

1

Z tej klasie, możesz uzyskać dane JSON z serwera lub z folderu zasobów. Można go łatwo zmienić na tylko jeden lub drugi. Jeśli potrzebujesz adapter, użyj tego jgilfelt created here on getHub.

@Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     Bundle getArgs = this.getArguments(); 
     String URI = getArgs.getString(KEY_URI);//OR YOU CAN HARD CODE THIS OR GET THE STRING ANYWAY YOU LIKE. 

     new GetJSONTask().execute(URI); 
    } 

    class GetJSONTask extends AsyncTask<String, Integer, String> { 

     protected String doInBackground(String... arg0) { 

      String uri = arg0[0]; 

      InputStream is = null; 

      if (uri.contains("http") == true) {// Get JSON from URL 
       try { 
        DefaultHttpClient httpClient = new DefaultHttpClient(); 
        HttpPost httpPost = new HttpPost(uri); 
        HttpResponse httpResponse = httpClient.execute(httpPost); 
        HttpEntity httpEntity = httpResponse.getEntity(); 
        is = httpEntity.getContent(); 

        BufferedReader rd = new BufferedReader(new InputStreamReader(is, "UTF-8")); 
        while ((line = rd.readLine()) != null) { 
         json += line; 
        } 
        rd.close(); 
        return json; 
       } catch (Exception e) { 
        e.printStackTrace(); 
        return null; 
       } 
      } else {// Get JSON from Assets 

       Writer writer = new StringWriter(); 
       char[] buffer = new char[1024]; 

       try { 
        InputStream jsonFile = getActivity().getAssets().open(uri); 
        Reader reader = new BufferedReader(new InputStreamReader(jsonFile, "UTF-8")); 
        int n; 
        while ((n = reader.read(buffer)) != -1) { 
         writer.write(buffer, 0, n); 
        } 
        jsonFile.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       json = writer.toString(); 
       // return JSON String 
       return json; 
      } 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      try { 
       showData(result); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
       Toast.makeText(getActivity(), "something went wrong", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 

    private void showData(String json) throws JSONException { 
     JSONObject o = new JSONObject(json); 
     JSONArray data = o.getJSONArray("results"); 
    } 
} 
18

Myślę, że problem, na który napotykasz, jest podobny do mojego, na który wpadłem. Jeśli uruchomisz:

 
String json_string = EntityUtils.toString(response.getEntity()); 
JSONObject temp1 = new JSONObject(json_string); 

Powyższy kod spowoduje zgłoszenie wyjątku i wygląda na to, że należy przypisać klamry tablic JSON. Ale dobrze jest mieć tablicę JSON jako element najwyższego poziomu! Wystarczy użyć JSONArray() zamiast JSONObject:

 
String json_string = EntityUtils.toString(response.getEntity()); 
JSONArray temp1 = new JSONArray(json_string); 

Więc trzeba wiedzieć, czy są coraz JSONArray lub pojedynczego słownika To jest JSONObject w kodzie JSON.

Jeśli jesteś przyzwyczajony do bibliotek parsowania JSON iOS/Objective-C, używają tego samego elementu najwyższego poziomu do obsługi słowników json i tablicy json, więc przejście do świata JAVA/Android wprawiło mnie w zakłopotanie, że mam do czynienia z dwoma typami JSON w zależności od zwróconego poziomu najwyższego.