You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Volley解析嵌套JSON?附MainClass.java相关代码片段

如何使用Volley解析嵌套JSON并填充RecyclerView

嘿,我来帮你搞定用Volley解析嵌套JSON的事儿,结合你给出的代码片段,咱们一步步来:

1. 先定义对应嵌套JSON的数据模型类

首先得根据API返回的JSON结构创建Java实体类(POJO),这样解析后的数据能直接映射成对象,方便后续操作。假设你的API返回的JSON结构大概是这样:

{
  "onwardFlights": [
    {
      "flightNumber": "AI101",
      "airline": "Air India",
      "departureTime": "08:00",
      "arrivalTime": "10:30",
      "price": 2500
      // 其他嵌套字段...
    }
  ]
}

那我们需要两个类:

Onwardflights.java(单个航班数据类)

public class Onwardflights {
    private String flightNumber;
    private String airline;
    private String departureTime;
    private String arrivalTime;
    private int price;

    // Getter和Setter方法
    public String getFlightNumber() { return flightNumber; }
    public void setFlightNumber(String flightNumber) { this.flightNumber = flightNumber; }

    public String getAirline() { return airline; }
    public void setAirline(String airline) { this.airline = airline; }

    // 其他字段的getter/setter同理补充
}

FlightResponse.java(顶层响应类)

import java.util.List;

public class FlightResponse {
    // 字段名要和JSON里的key完全一致(大小写敏感)
    private List<Onwardflights> onwardFlights;

    public List<Onwardflights> getOnwardFlights() { return onwardFlights; }
    public void setOnwardFlights(List<Onwardflights> onwardFlights) { this.onwardFlights = onwardFlights; }
}

2. 在MainClass中实现Volley请求与嵌套JSON解析

接下来完善你的MainClass代码,把Volley请求、JSON解析和RecyclerView初始化整合起来:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_activity_layout); // 替换成你的布局文件名

    // 初始化Toolbar
    mToolbar = findViewById(R.id.toolbar);
    setSupportActionBar(mToolbar);

    // 初始化RecyclerView相关组件
    recyclerView = findViewById(R.id.recyclerView);
    layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);
    onwardflights = new ArrayList<>();
    adapter = new FlightListAdapter(onwardflights); // 后面会写这个Adapter
    recyclerView.setAdapter(adapter);

    // 初始化加载弹窗
    progressDialog = new ProgressDialog(this);
    progressDialog.setMessage("加载航班数据中...");
    progressDialog.show();

    // 初始化Volley请求队列
    RequestQueue requestQueue = Volley.newRequestQueue(this);

    // 发起GET请求获取JSON数据
    JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.GET, url, null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    progressDialog.dismiss();
                    try {
                        // 从顶层JSON中取出航班数组
                        JSONArray flightArray = response.getJSONArray("onwardFlights");

                        // 遍历数组,逐个解析成Onwardflights对象
                        for (int i = 0; i < flightArray.length(); i++) {
                            JSONObject flightJson = flightArray.getJSONObject(i);
                            Onwardflights flight = new Onwardflights();

                            // 填充字段,注意JSON的key要和set方法对应
                            flight.setFlightNumber(flightJson.getString("flightNumber"));
                            flight.setAirline(flightJson.getString("airline"));
                            flight.setDepartureTime(flightJson.getString("departureTime"));
                            flight.setPrice(flightJson.getInt("price"));

                            onwardflights.add(flight);
                        }

                        // 通知Adapter数据更新,刷新RecyclerView
                        adapter.notifyDataSetChanged();

                    } catch (JSONException e) {
                        e.printStackTrace();
                        Toast.makeText(MainClass.this, "数据解析出错", Toast.LENGTH_SHORT).show();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            progressDialog.dismiss();
            Toast.makeText(MainClass.this, "请求失败:" + error.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });

    // 将请求加入队列执行
    requestQueue.add(jsonRequest);
}

3. 实现RecyclerView的Adapter

最后写一个简单的Adapter来展示解析后的航班数据:

public class FlightListAdapter extends RecyclerView.Adapter<FlightListAdapter.FlightViewHolder> {

    private List<Onwardflights> flightList;

    public FlightListAdapter(List<Onwardflights> flightList) {
        this.flightList = flightList;
    }

    @NonNull
    @Override
    public FlightViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.flight_item_layout, parent, false); // 替换成你的列表项布局
        return new FlightViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull FlightViewHolder holder, int position) {
        Onwardflights currentFlight = flightList.get(position);
        holder.tvFlightNum.setText(currentFlight.getFlightNumber());
        holder.tvAirline.setText(currentFlight.getAirline());
        holder.tvPrice.setText("¥" + currentFlight.getPrice());
        // 其他字段同理绑定到控件上
    }

    @Override
    public int getItemCount() {
        return flightList.size();
    }

    // 列表项视图持有者
    public static class FlightViewHolder extends RecyclerView.ViewHolder {
        TextView tvFlightNum, tvAirline, tvPrice;

        public FlightViewHolder(@NonNull View itemView) {
            super(itemView);
            tvFlightNum = itemView.findViewById(R.id.tv_flight_number);
            tvAirline = itemView.findViewById(R.id.tv_airline);
            tvPrice = itemView.findViewById(R.id.tv_price);
            // 初始化其他需要展示的控件
        }
    }
}

几个关键注意事项

  • 字段名匹配:JSON中的key必须和Java类的字段名完全一致(大小写敏感),如果JSON里的key和你想定义的字段名不一样,可以用@SerializedName注解(需要引入Gson库)来做映射,比如:
    import com.google.gson.annotations.SerializedName;
    public class Onwardflights {
        @SerializedName("flight_number")
        private String flightNumber;
        // ...
    }
    
  • 权限与依赖:别忘了在AndroidManifest.xml中添加网络权限:
    <uses-permission android:name="android.permission.INTERNET" />
    
    同时在Module级别的build.gradle中添加Volley依赖:
    dependencies {
        implementation 'com.android.volley:volley:1.2.1'
    }
    

这样就能完成嵌套JSON的解析,把数据顺利展示到RecyclerView里啦!

内容的提问来源于stack exchange,提问作者mDeveloper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:54:16