Android中能否将API GET响应存为JSON文件而非JSONObject?
问题解答
核心结论
Android的assets目录是只读目录——它在APK打包阶段就被固化,应用安装后无法向其中写入或修改文件。因此你无法直接将API响应保存到assets目录中。
替代方案:保存到可写入的存储位置
你可以把JSON响应保存到以下可写入的存储区域:
- 应用内部存储:仅当前应用可访问,无需额外权限
- 应用外部存储:其他应用可访问,Android 6.0及以上需动态申请权限
修改后的代码示例(保存到内部存储)
在onResponse方法中添加文件写入逻辑,替换原有的JSONObject转换代码:
public void getAssetPlant(final VolleyCallBack callBack) { RequestQueue requestQueue = Volley.newRequestQueue(this); StringRequest request = new StringRequest(Request.Method.GET, url_assets, new Response.Listener<String>() { @Override public void onResponse(String response) { try { // 将API响应写入内部存储文件 FileOutputStream outputStream = openFileOutput("assets_data.json", Context.MODE_PRIVATE); outputStream.write(response.getBytes()); outputStream.close(); callBack.onSuccess(); } catch (IOException e) { e.printStackTrace(); // 可选:触发回调告知写入失败 // callBack.onFailure(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { String errorMsg = "Failed to gather info"; if (error.networkResponse != null) { errorMsg += " " + error.networkResponse.statusCode; } Toast.makeText(MapActivity.this, errorMsg, Toast.LENGTH_SHORT).show(); } }) { @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = new HashMap<>(); headers.put("Authorization", "Bearer " + token); return headers; } }; requestQueue.add(request); }
读取保存的JSON文件
后续需要使用该文件时,可通过以下代码读取:
try { FileInputStream inputStream = openFileInput("assets_data.json"); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder contentBuilder = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { contentBuilder.append(line); } inputStream.close(); String jsonContent = contentBuilder.toString(); // 按需转换为JSONObject使用 JSONObject jsonObject = new JSONObject(jsonContent); } catch (IOException | JSONException e) { e.printStackTrace(); }
保存到外部存储的注意事项
如果选择保存到外部存储:
- 在
AndroidManifest.xml中声明权限(Android 6.0+需动态申请):
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 获取外部存储路径并写入:
File externalDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS); File jsonFile = new File(externalDir, "assets_data.json"); // 写入逻辑与内部存储类似,使用FileOutputStream操作jsonFile
内容的提问来源于stack exchange,提问作者Francisco Torres
相关产品推荐
相关产品推荐

