0

このコードのエラーを見つけるのを手伝ってください。jsonによってリモートサーバー(php&mysql)からデータを取得したいのですが、それを解析すると、結果がnullを返すという問題がありますが、次のリンクで 名前を返すことになっています:http: //codeincloud.tk/json_android_example.php

package com.shadatv.shada;

import java.io.IOException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

public class canticlesActivity extends Activity {

    TextView httpStuff;
    HttpClient client;
    JSONObject json;

    final static String URL = "http://codeincloud.tk/json_android_example.php";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.canticles);

        httpStuff = (TextView) findViewById(R.id.textView1);
        client = new DefaultHttpClient();
        new Read().execute("name");
    }

    public JSONObject lastTweet() throws ClientProtocolException, IOException, JSONException {
        StringBuilder url = new StringBuilder(URL);

        HttpGet get = new HttpGet(url.toString());
        HttpResponse r = client.execute(get);
        int status = r.getStatusLine().getStatusCode();

        if (status == 200) {
            HttpEntity e = r.getEntity();
            String data = EntityUtils.toString(e);
            JSONArray timeline = new JSONArray(data);
            JSONObject last = timeline.getJSONObject(0);
            return last;

        } else {
            Toast.makeText(getBaseContext(), "error", Toast.LENGTH_SHORT);
            return null;
        }
    }

    public class Read extends AsyncTask<String, Integer, String>{

        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub

            try {
                json = lastTweet();
                return json.getString(params[0]);
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            // TODO Auto-generated method stub
            Toast.makeText(getBaseContext(), "ahmed .. " + result, Toast.LENGTH_LONG).show();
            httpStuff.setText(result);
        }

    }
}
4

4 に答える 4

1

現在のjson文字列を次のように解析します:

 HttpEntity e = r.getEntity();
 String data = EntityUtils.toString(e);
 // convert data to json object
 JSONObject last =new JSONObject(data);

現在のWebサービスがJSONObject代わりにのみ再調整するためJSONArray

于 2013-02-19T11:08:50.010 に答える
1

URLは次のデータを提供します。

{"name": "Froyo"、 "version": "Android 2.2"}

JSONを解析するコードのチャンクは次のとおりです。

        JSONArray timeline = new JSONArray(data);
        JSONObject last = timeline.getJSONObject(0);

これは、読んでいるJSONドキュメントがオブジェクトではなく配列であると想定しています。(どちらも有効なJSONですが、フェッチしているドキュメントは明らかにオブジェクトです)。Webサービス呼び出しは、常にどちらか一方を返すとは限らないため、正しいタイプに対して解析していることに注意する必要があります。

于 2013-02-19T11:21:16.517 に答える
0

コピーして過去に動作しています。JSONObjectを最後に変更しました=newJSONObject(data);

http://codeincloud.tk/json_android_example.phpがJSONObjectを再調整するため

package com.shadatv.shada;

import java.io.IOException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

public class canticlesActivity extends Activity {

    TextView httpStuff;
    HttpClient client;
    JSONObject json;

    final static String URL = "http://codeincloud.tk/json_android_example.php";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.canticles);

        httpStuff = (TextView) findViewById(R.id.textView1);
        client = new DefaultHttpClient();
        new Read().execute("name");
    }

    public JSONObject lastTweet() throws ClientProtocolException, IOException, JSONException {
        StringBuilder url = new StringBuilder(URL);

        HttpGet get = new HttpGet(url.toString());
        HttpResponse r = client.execute(get);
        int status = r.getStatusLine().getStatusCode();

        if (status == 200) {
            HttpEntity e = r.getEntity();
            String data = EntityUtils.toString(e);

            JSONObject last =  new JSONObject(data);
            return last;

        } else {
            Toast.makeText(getBaseContext(), "error", Toast.LENGTH_SHORT);
            return null;
        }
    }

    public class Read extends AsyncTask<String, Integer, String>{

        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub

            try {
                json = lastTweet();
                return json.getString(params[0]);
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            // TODO Auto-generated method stub
            Toast.makeText(getBaseContext(), "ahmed .. " + result, Toast.LENGTH_LONG).show();
            httpStuff.setText(result);
        }

    }
}
于 2013-02-19T11:11:43.793 に答える
0

手動解析を行うよりもはるかに簡単なGSONライブラリを使用することをお勧めします。

ライブラリへのリンクは次のとおりです:http ://code.google.com/p/google-gson/

于 2013-02-19T11:21:12.380 に答える