开发JSON操作应用:如何从final.json读取指定字段到单选按钮?
嘿,我来帮你搞定这个问题!要实现只读取final.json里的name、date、time字段并展示到单选按钮,咱们可以按照以下步骤来操作:
第一步:读取final.json文件内容
首先得把final.json里的内容读成字符串,假设你的final.json放在Android项目的assets目录下(如果是存储在外部存储,逻辑类似,只是读取路径不同),可以用下面的方法读取:
private String readFinalJsonFromAssets() { StringBuilder stringBuilder = new StringBuilder(); try { InputStream inputStream = getAssets().open("final.json"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = bufferedReader.readLine()) != null) { stringBuilder.append(line); } bufferedReader.close(); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } return stringBuilder.toString(); }
第二步:解析JSON,提取指定字段
接下来解析读取到的JSON字符串,只提取我们需要的name、date、time字段。这里提供两种方式:
方式一:使用原生JSON API(无需第三方库)
如果final.json的结构是一个包含多条记录的JSON数组(比如[{"name":"张三", "date":"2024-05-20", "time":"14:30"}, ...]),可以这样解析:
private List<Map<String, String>> extractTargetFields(String jsonString) { List<Map<String, String>> recordList = new ArrayList<>(); try { JSONArray jsonArray = new JSONArray(jsonString); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); Map<String, String> record = new HashMap<>(); // 只提取需要的字段,不存在的话可以设默认值或者跳过 record.put("name", jsonObject.optString("name", "未知名称")); record.put("date", jsonObject.optString("date", "未知日期")); record.put("time", jsonObject.optString("time", "未知时间")); recordList.add(record); } } catch (JSONException e) { e.printStackTrace(); } return recordList; }
方式二:使用Gson库(更简洁)
如果你已经引入了Gson库(在build.gradle里添加implementation 'com.google.code.gson:gson:2.10.1'),可以先创建一个只包含目标字段的实体类:
public class FinalRecord { private String name; private String date; private String time; // 生成getter方法 public String getName() { return name; } public String getDate() { return date; } public String getTime() { return time; } }
然后用Gson解析:
private List<FinalRecord> extractTargetFieldsWithGson(String jsonString) { Gson gson = new Gson(); Type listType = new TypeToken<List<FinalRecord>>(){}.getType(); return gson.fromJson(jsonString, listType); }
Gson会自动忽略实体类中不存在的字段,完美符合我们只提取指定字段的需求。
第三步:将字段展示到单选按钮
假设你在布局里有一个RadioGroup(比如id是rg_records),我们可以动态生成RadioButton并添加进去,把每个记录的name、date、time组合成按钮文本:
private void setupRadioButtons(List<?> recordList) { RadioGroup radioGroup = findViewById(R.id.rg_records); radioGroup.removeAllViews(); // 先清空原有按钮 for (Object record : recordList) { RadioButton radioButton = new RadioButton(this); String buttonText; if (record instanceof Map) { Map<String, String> map = (Map<String, String>) record; buttonText = String.format("姓名:%s | 日期:%s | 时间:%s", map.get("name"), map.get("date"), map.get("time")); } else if (record instanceof FinalRecord) { FinalRecord finalRecord = (FinalRecord) record; buttonText = String.format("姓名:%s | 日期:%s | 时间:%s", finalRecord.getName(), finalRecord.getDate(), finalRecord.getTime()); } else { buttonText = "无效记录"; continue; } radioButton.setText(buttonText); radioGroup.addView(radioButton); } }
最后,在Activity的onCreate里串联起来
把上面的方法整合到onCreate中:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_activity_layout); // 读取JSON String jsonContent = readFinalJsonFromAssets(); // 提取字段(选一种方式即可) List<Map<String, String>> records = extractTargetFields(jsonContent); // 或者用Gson的方式:List<FinalRecord> records = extractTargetFieldsWithGson(jsonContent); // 设置单选按钮 setupRadioButtons(records); }
这样就能实现只读取final.json里的指定字段,并且把每条记录的信息展示在单选按钮里啦!如果你的final.json结构不是数组,而是单个对象或者其他结构,只需要调整解析部分的代码就行~
内容的提问来源于stack exchange,提问作者Manu

