0

そのJSON http://rutube.ru/api/video/editors/?page=1&format=jsonを解析するにはどうすればよいですか? 空の表示があります。http://www.androidhive.info/2012/01/android-json-parsing-tutorial/から例を挙げます

JSONPARSER.java

public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

// constructor
public JSONParser() {

}

public JSONObject getJSONFromUrl(String url) {

    try {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        HttpResponse httpResponse = httpClient.execute(httpPost);   
        int httpStatus = httpResponse.getStatusLine().getStatusCode();
        if (httpStatus != HttpStatus.SC_OK) {
            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        is, "iso-8859-1"), 8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                is.close();
                json = sb.toString();
            } catch (Exception e) {
                Log.e("Buffer Error", "Error converting result " + e.toString());
            }

            // try parse the string to a JSON object
            try {
                jObj = new JSONObject(json);
            } catch (JSONException e) {
                Log.e("JSON Parser", "Error parsing data " + e.toString());
            }

        }       
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return jObj;
    }
 }

MAINACTIVITY.java

    public class MainActivity extends ListActivity {
private static String URL_VIDEO = "http";
private static final String TAG_RESULTS = "results";
private static final String VIDEO_OBJECT = "video";
private static final String VIDEO_ID = "id";
private static final String VIDEO_TITLE = "title";
private static final String VIDEO_CREATED_TS = "created_ts";

JSONArray results = null;

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

    ArrayList<HashMap<String, String>> resultList = new ArrayList<HashMap<String,String>>();
    JSONParser jParser = new JSONParser();
    JSONObject json = jParser.getJSONFromUrl(URL_VIDEO);
        try {               
            results = json.getJSONArray(TAG_RESULTS);
        for (int i = 0; i < results.length(); i++) {
            JSONObject c = results.getJSONObject(i);
            JSONObject video = c.getJSONObject(VIDEO_OBJECT);
            String id = video.getString(VIDEO_ID);
            String title = video.getString(VIDEO_TITLE);
            String created_ts = video.getString(VIDEO_CREATED_TS);
            HashMap<String, String> map = new HashMap<String, String>();
            map.put(VIDEO_ID, id);
            map.put(VIDEO_TITLE, title);
            map.put(VIDEO_CREATED_TS, created_ts);              
            resultList.add(map);
        }
    } catch(JSONException e) {
        e.printStackTrace();
    }
        ListAdapter adapter = new SimpleAdapter(this, resultList, 
                R.layout.list_video_item, 
                new String[] { VIDEO_OBJECT, VIDEO_TITLE, VIDEO_CREATED_TS }, new int[] { R.id.object, R.id.title, R.id.created_ts });
        setListAdapter(adapter);
        ListView lv = getListView();
    }
 }
4

3 に答える 3

1

Google のgson ライブラリを使用すると、非常に簡単です。

String json = getJSONFromUrl(URL);// get json from internet as usual
Gson gson = new Gson();
Data data = gson.fromJson(json, Data.class); // let gson handle all the parsing and create Java objects

このWebサイトを使用して生成されたDataクラスはここにあります。あなたがやっているように手動でjsonを解析したことはありません。

于 2013-10-04T06:35:26.617 に答える
0

URL_VIDEO引数として渡している には のみが含まれているため、これはプロリーですhttp

于 2013-10-04T06:22:28.547 に答える
0

サーバー通信中に何かが失敗した可能性があります。コンテンツを読み取る前に、サーバーの応答コードを確認する必要があります。の後にこのコードを追加しますhttpClient.execute(httpPost);

int httpStatus = httpResponse.getStatusLine().getStatusCode();
switch( httpStatus )
{ 
  case HttpStatus.SC_OK:
  {
    HttpEntity httpEntity = httpResponse.getEntity();
    is = httpEntity.getContent(); 
    // Continue with reading the content here
  }
  default:
  {   
    // here you can print errormessages or information what happened 
  }
}

クラスの完全なコードは次のようになります。

public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

// constructor
public JSONParser() {

}

public JSONObject getJSONFromUrl(String url) {

    try {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        HttpResponse httpResponse = httpClient.execute(httpPost);   
        int httpStatus = httpResponse.getStatusLine().getStatusCode();
        switch( httpStatus )
        { 
          case HttpStatus.SC_OK:
          {
            try {
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        is, "iso-8859-1"), 8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                is.close();
                json = sb.toString();
            } catch (Exception e) {
                Log.e("Buffer Error", "Error converting result " + e.toString());
            }

            // try parse the string to a JSON object
            try {
                jObj = new JSONObject(json);
            } catch (JSONException e) {
                Log.e("JSON Parser", "Error parsing data " + e.toString());
            }
          }       
          break;
        }
        default:
        {   
           Log.e("JSON Parser", "HttpStatus: "+httpResponse.getStatusLine().getStatusCode() + ", message: " + httpResponse.getStatusLine().getReasonPhrase()  );
          jObj = null;
        }
      }
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return jObj;
    }
 }

これは、サーバーの応答を確認するのに役立ちますt forget a { in the code ;) The 'default' of the switch is your error section, for every server response except。サーバーの応答を含むログ エントリが表示されることを願っています。

さらにケースが必要な場合 (たとえば、Yust403 Forbiddenの別のメッセージが好きな場合は、ブロックを追加します。HTTP ステータスコードcase HttpStatus.SC_XXXXXに関する詳細情報が必要な場合は、wiki を確認してください。

于 2013-10-04T06:24:52.233 に答える