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

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();
}

保存到外部存储的注意事项

如果选择保存到外部存储:

  1. 在AndroidManifest.xml中声明权限(Android 6.0+需动态申请):
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  1. 获取外部存储路径并写入:
File externalDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
File jsonFile = new File(externalDir, "assets_data.json");
// 写入逻辑与内部存储类似,使用FileOutputStream操作jsonFile

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:05:15