【问题标题】:Android JSON array through URLAndroid JSON数组通过URL
【发布时间】:2015-07-01 15:06:38
【问题描述】:

我是新人,我正在制作 Android 应用程序,它将显示激战 2 游戏中的物品信息。该数据在这里: https://api.guildwars2.com/v2/items 我需要阅读这些项目的整个列表(名称、价格、图标),像列表视图一样显示它们。 问题是我需要将 url 修改为特定项目,例如: https://api.guildwars2.com/v2/items/256 是否可以一次访问所有项目? 我的代码:

package com.wingnity.jsonparsingtutorial;

import java.io.IOException;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
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.app.ProgressDialog;
import android.content.Intent;
import android.net.ParseException;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

public class MainActivity extends Activity {

ArrayList<Actors> actorsList;

ActorAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    actorsList = new ArrayList<Actors>();
    new JSONAsyncTask().execute("https://api.guildwars2.com/v2/items");

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

    listview.setAdapter(adapter);

    listview.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                long id) {
            // TODO Auto-generated method stub
            Toast.makeText(getApplicationContext(), actorsList.get(position).getName(), Toast.LENGTH_LONG).show();              
        }
    });
}


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

    ProgressDialog dialog;

    @Override
    protected void onPreExecute()
    {
        super.onPreExecute();
        dialog = new ProgressDialog(MainActivity.this);
        dialog.setMessage("Wczytywanie prosze czekac");
        dialog.setTitle("Polaczenie z serwerem");
        dialog.show();
        dialog.setCancelable(false);
    }

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

            //------------------>>
            HttpGet httppost = new HttpGet(urls[0]);
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response = httpclient.execute(httppost);

            // StatusLine stat = response.getStatusLine();
            int 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("256");

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

                    Actors actor = new Actors();

                    actor.setName(object.getString("name"));
                    actor.setDescription(object.getString("description"));
                    actor.setDob(object.getString("type"));
                    actor.setCountry(object.getString("level"));
                    actor.setHeight(object.getString("rarity"));
                    actor.setSpouse(object.getString("vendor_value"));
                    actor.setChildren(object.getString("default_skin"));
                    actor.setImage(object.getString("icon"));

                    actorsList.add(actor);
                }
                return true;
            }

            //------------------>>

        } catch (ParseException e1)
        {
            e1.printStackTrace();
        } catch (IOException e)
        {
            e.printStackTrace();
        } catch (JSONException e)
        {
            e.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();

    }
}

}

【问题讨论】:

    标签: java android arrays json parsing


    【解决方案1】:

    您可以在此 API 的文档之前使用批量扩展。 API documentation

    但是有一个问题是你不能使用像https://api.guildwars2.com/v2/colors?ids=all 这样的东西来作为物品。但是您可以通过 id 列表获取项目。这是 10 项,例如:https://api.guildwars2.com/v2/items?ids=1,2,3,4,5,6,7,8,9,10

    所以我认为您可以这样编写代码(其中“n”是所有项目的数量):

    String GET_ITEMS_URL = "https://api.guildwars2.com/v2/items?ids="; 
    for(int i = 1; i <= n; i++){
         GET_ITEMS_URL += i + ",";
    }
    

    这有点棘手,但它可以作为此 API 的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-25
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多