【问题标题】:JSON Parsing with Volley and GSON使用 Volley 和 GSON 进行 JSON 解析
【发布时间】:2014-12-07 10:48:44
【问题描述】:

我正在尝试从这个 url 解析 json

http://api.openweathermap.org/data/2.5/forecast/daily?q=09100&mode=json&units=metric&cnt=7&lang=tr

我为 gson 创建了 pojo,并将基于 volley 的类添加到我的应用程序中。

我想用我的自定义适配器将 json 对象解析到我的列表视图中

我的 Volley+Gson 请求:

  private void loadAPI(){
        mRequestQueue = Volley.newRequestQueue(getActivity());

        String url = "http://api.openweathermap.org/data/2.5/forecast/daily?q=09100&mode=json&units=metric&cnt=7&lang=tr";
        //showDialog();
        GsonRequest<WeatherItem> myReq = new GsonRequest<WeatherItem>(
                Request.Method.GET,
                url,
                WeatherItem.class,
                mOnWeatherResponseLister(),
                mOnErrorListener());


        mRequestQueue.add(myReq);

    }

    private Response.Listener<WeatherItem> mOnWeatherResponseLister() {
  ForecastFragment 108 =  return new Response.Listener<WeatherItem>() {
            @Override
            public void onResponse(WeatherItem response) {
                try {
                    Log.d("Json Response", response.list.toString());
                    Log.d("Json Response", response.list.get(0).dt.toString());
                    Log.d("Json Response", response.list.get(0).weather.get(0).description.toString());
                    Log.d("Json Response",WeatherUtility.formatMinTemperature(getActivity(),response.list.get(0).temp.min));
                    for (int i = 0; i<=response.list.size()-1 ; i++) {


                        WeatherResp weatherResp = new WeatherResp();
                        Weather weather= new Weather();
                          weatherResp.weather.set(i,weather).setIcon(WeatherUtility.getIconResourceForWeatherCondition(response.list.get(i).weather.get(i).id));
                Fragment 121 = weatherResp.setDt((response.list.get(i).dt));
                          weatherResp.weather.set(i,weather).setDescription(response.list.get(i).weather.get(i).description.toString());
                          weatherResp.temp.setMin(Double.valueOf(WeatherUtility.formatMinTemperature(getActivity(), response.list.get(i).temp.min)));
                          weatherResp.temp.setMax(Double.valueOf(WeatherUtility.formatMaxTemperature(getActivity(), response.list.get(i).temp.max)));

                        arrItemList.add(weatherResp);
                    }

                    mListView.setAdapter(mForecastAdapter);
                    mForecastAdapter.notifyDataSetChanged();


                } catch (Exception e) {
                    e.printStackTrace();
                }
                //hideDialog();
            }

            ;
        };
    }

Pojos:

public class WeatherItem {

    public String cod;
    public String message;
    public int cnt;
    public ArrayList<WeatherResp> list;
    public String getCod() {
        return cod;
    }

public class WeatherResp {

    public Long dt;
    public Temp temp;
    public Float pressure;
    public Integer humidity;
    public ArrayList<Weather> weather;
    public Float speed;
    public Float deg;
    public Integer clouds;

public class Weather {

    public Integer id;
    public String main;
    public String description;
    public int icon;
public class Temp {


    public Float day;
    public Double min;
    public Double max;
    public Double night;
    public Double eve;
    public Double morn;

我的适配器:

public class WeatherAdapter extends BaseAdapter {


private Context ctx;
private ArrayList<WeatherItem> weatherItems;
private ArrayList<WeatherResp> arrItemList;

public WeatherAdapter(Context ctx, ArrayList<WeatherResp> weatherResps) {

    this.ctx = ctx;
    this.arrItemList = weatherResps;
}

public static class ViewHolder {
    public ImageView iconView;
    public TextView dateView;
    public TextView descriptionView;
    public TextView highTempView;
    public TextView lowTempView;
    //public TextView humidity;
    //public TextView pressure;


    public ViewHolder(View v) {
        iconView = (ImageView) v.findViewById(R.id.list_item_icon);
        dateView = (TextView) v.findViewById(R.id.list_item_date_textview);
        descriptionView = (TextView) v.findViewById(R.id.list_item_forecast_textview);
        highTempView = (TextView) v.findViewById(R.id.list_item_high_textview);
        lowTempView = (TextView) v.findViewById(R.id.list_item_low_textview);

        v.setTag(this);
    }
}

/**
 * Cache of the children views for a forecast list item.
 */
@Override
public int getCount() {
    return weatherItems.size();

}

@Override
public Object getItem(int i) {
    return weatherItems.get(i);
}

@Override
public long getItemId(int i) {
    return 0;
}

@Override
public View getView(int position, View convertview, ViewGroup viewGroup) {

    ViewHolder holder;
    View v = convertview;

    if (v == null) {
        v = View.inflate(ctx, R.layout.list_items_forecast, viewGroup);
        holder = new ViewHolder(v);
        holder.iconView = (ImageView) v.findViewById(R.id.list_item_icon);
        holder.dateView = (TextView) v.findViewById(R.id.list_item_date_textview);
        holder.descriptionView = (TextView) v.findViewById(R.id.list_item_forecast_textview);
        holder.lowTempView = (TextView) v.findViewById(R.id.list_item_low_textview);
        holder.highTempView = (TextView) v.findViewById(R.id.list_item_high_textview);
        v.setTag(holder);
    } else {
        holder = (ViewHolder) v.getTag();
    }

    WeatherResp weatherResp1 = arrItemList.get(position);

    holder.iconView.setImageResource(weatherResp1.getWeather().get(position).getIcon());
    holder.dateView.setText(weatherResp1.getDt().toString());
    holder.descriptionView.setText(weatherResp1.getWeather().get(position).getDescription());
    holder.lowTempView.setText(WeatherUtility.formatMinTemperature(ctx, weatherResp1.getTemp().min));
    holder.highTempView.setText(WeatherUtility.formatMaxTemperature(ctx,weatherResp1.getTemp().max));
    return v;
}

当我运行我的 logcat 时:

W/System.err﹕ java.lang.NullPointerException
W/System.err﹕ at com.hasan.basan.fragment.ForecastFragment$1.onResponse(ForecastFragment.java:121)
W/System.err﹕ at com.hasan.basanfragment.ForecastFragment$1.onResponse(ForecastFragment.java:108)
W/System.err﹕ at com.hasan.basan.utility.GsonRequest.deliverResponse(GsonRequest.java:78)
W/System.err﹕ at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:725)
W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:92)
W/System.err﹕ at android.os.Looper.loop(Looper.java:137)
W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5041)
W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511)
W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)

我的错误在哪里?提前致谢

【问题讨论】:

标签: java android json gson android-volley


【解决方案1】:

你的异常是从这里抛出的: com.hasan.basan.fragment.ForecastFragment$1.onResponse(ForecastFragment.java:121) 我看不到行号,所以我会尝试猜测抛出异常的原因。

WeatherResp weatherResp = new WeatherResp();
Weather weather= new Weather();
weatherResp.weather.set(i,weather).setIcon(WeatherUtility.getIconResourceForWeatherCondition(response.list.get(i).weather.get(i).id));

在代码的第 3 行,您正在访问变量 weatherResp.weather。我有两个解释。

  1. 也许您忘记将新的 Weather 实例设置为您的 weatherResp 变量。

  2. 也许您忘记在WeatherResp 类的默认构造函数中初始化ArrayListWeather 变量。

【讨论】:

  • 我像这样更改了天气 public class Weather extends ArrayList { 并且我向 WeatherResp 添加了一个构造函数 public WeatherResp(ArrayList weather) { this.weather = weather; }
  • NPE 消失了,但我的列表视图未填充 :(
  • 当我调试 arrItemList = {java.util.ArrayList@3462362} size=0 我认为它应该填充weatherResp变量。
  • @HasanBasan 你发现什么变量是空的?
  • 我有 4 个模型类,我想用 Wea​​therResp 的实例填充我的数组列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多