如何使用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中添加网络权限:
同时在Module级别的<uses-permission android:name="android.permission.INTERNET" />build.gradle中添加Volley依赖:dependencies { implementation 'com.android.volley:volley:1.2.1' }
这样就能完成嵌套JSON的解析,把数据顺利展示到RecyclerView里啦!
内容的提问来源于stack exchange,提问作者mDeveloper
相关产品推荐
相关产品推荐

