2012-06-20 22 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はjson文字列を生成します。私はresponseからどのように取り出すのですか? Btw;私はGSONライブラリをicludedしましたが、おそらく私はそれの任意のメソッドを使用することができますか?これと同じHttpResponseからjsonを取得

ソリューションは芋、かなり醜い:best way to handle json from httpresponse android

があるくらいであること、より良い方法を、右?

すべてのヘルプは高く評価され、感謝


アップデート:

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

トリックを行うようです。わずか1つの小さな問題があります:文字列は角かっこで囲まれています[]。手動で削除する必要がありますか?これらは、PHPによって生成されます。■json_encode()

私は自分のWebサービスからJSON文字列を返していた場合
+1

大括弧はJSON配列を表します。そのように応答を処理する必要があります。 – Perception

+0

@Perception Correct。コンテナ配列をPHPコードから削除し、問題を解決しました。ありがとうございました – Johan

+0

@Johanあなたの答えを投稿して受け入れて、他の人が役に立つと思って、問題を正確に解決したものが分かるようにしてください。ありがとう! –

答えて

1

問題は私のPHPファイルにあります。 jsonでエンコードされたオブジェクトからコンテナ配列を削除すると、Javaコードが機能します。

0

は、私は通常それほどのようなJSONオブジェクトに戻ってそれを取得したい:このクラスでは

String response = client.getResponse(); 

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

きれいに見える、入力のおかげで。しかし、問題はPHPに関連していた、上記の私のコメントを参照してください。 – Johan

1

、サーバーまたはアセットフォルダからJSONデータを取得できます。どちらか一方に簡単に変更することができます。アダプタが必要な場合は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

あなたが遭遇している問題は、自分のものと似ていると思います。実行した場合:

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

上記のコードでは例外がスローされ、JSONの配列ブラケットが責任を負うように見えます。しかし、トップレベルの要素としてJSON配列を持つのはうれしいことです!あなただけの代わりに、JSONObjectの)(JSONArrayを使用する必要があります。

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

だから、あなたがJSONArrayしたり、JSONコードでJSONObjectある単一の辞書を取得しているかどうかを知る必要があります。

iOS/Objective-C JSON解析ライブラリに慣れている人は、json辞書とjson配列を扱うために同じトップレベル要素を使用しているので、JAVA/Androidの世界に移動すると2つのタイプの処理返されるトップレベルに応じてJSON。

関連する問題