Использование JSON-файла в ресурсах приложения для Android
предположим, что у меня есть файл с содержимым JSON в папке raw resources в моем приложении. Как я могу прочитать это в приложение, чтобы я мог разобрать JSON?
6 ответов:
посмотреть openRawResource. Что-то вроде этого должно работать:
InputStream is = getResources().openRawResource(R.raw.json_file); Writer writer = new StringWriter(); char[] buffer = new char[1024]; try { Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); int n; while ((n = reader.read(buffer)) != -1) { writer.write(buffer, 0, n); } } finally { is.close(); } String jsonString = writer.toString();
Котлин теперь официальный язык для Android, поэтому я думаю, что это было бы полезно для кого-то
val text = resources.openRawResource(R.raw.your_text_file) .bufferedReader().use { it.readText() }
я использовал ответ @kabuko для создания объекта, который загружается из файла JSON, используя Gson, из ресурсов:
package com.jingit.mobile.testsupport; import java.io.*; import android.content.res.Resources; import android.util.Log; import com.google.gson.Gson; import com.google.gson.GsonBuilder; /** * An object for reading from a JSON resource file and constructing an object from that resource file using Gson. */ public class JSONResourceReader { // === [ Private Data Members ] ============================================ // Our JSON, in string form. private String jsonString; private static final String LOGTAG = JSONResourceReader.class.getSimpleName(); // === [ Public API ] ====================================================== /** * Read from a resources file and create a {@link JSONResourceReader} object that will allow the creation of other * objects from this resource. * * @param resources An application {@link Resources} object. * @param id The id for the resource to load, typically held in the raw/ folder. */ public JSONResourceReader(Resources resources, int id) { InputStream resourceReader = resources.openRawResource(id); Writer writer = new StringWriter(); try { BufferedReader reader = new BufferedReader(new InputStreamReader(resourceReader, "UTF-8")); String line = reader.readLine(); while (line != null) { writer.write(line); line = reader.readLine(); } } catch (Exception e) { Log.e(LOGTAG, "Unhandled exception while using JSONResourceReader", e); } finally { try { resourceReader.close(); } catch (Exception e) { Log.e(LOGTAG, "Unhandled exception while using JSONResourceReader", e); } } jsonString = writer.toString(); } /** * Build an object from the specified JSON resource using Gson. * * @param type The type of the object to build. * * @return An object of type T, with member fields populated using Gson. */ public <T> T constructUsingGson(Class<T> type) { Gson gson = new GsonBuilder().create(); return gson.fromJson(jsonString, type); } }
чтобы использовать его, вы бы сделали что-то вроде следующего (пример находится в
InstrumentationTestCase
):@Override public void setUp() { // Load our JSON file. JSONResourceReader reader = new JSONResourceReader(getInstrumentation().getContext().getResources(), R.raw.jsonfile); MyJsonObject jsonObj = reader.constructUsingGson(MyJsonObject.class); }
от http://developer.android.com/guide/topics/resources/providing-resources.html:
raw/
Произвольные файлы для сохранения в необработанном виде. Чтобы открыть эти ресурсы с помощью необработанного входного потока, вызовите Resources.openRawResource () с идентификатором ресурса, который является R. raw.имя файла.однако, если вам нужен доступ к исходным именам файлов и иерархии файлов, вы можете сохранить некоторые ресурсы в каталоге assets/ (вместо res / raw/). Файлы в assets / не имеют идентификатора ресурса, поэтому вы можете прочитать их только с помощью AssetManager.
InputStream is = mContext.getResources().openRawResource(R.raw.json_regions); int size = is.available(); byte[] buffer = new byte[size]; is.read(buffer); is.close(); String json = new String(buffer, "UTF-8");
как @ mah государства, документация Android (https://developer.android.com/guide/topics/resources/providing-resources.html) говорит, что файлы json могут быть сохранены в каталоге / raw в каталоге /res (resources) в вашем проекте, например:
MyProject/ src/ MyActivity.java res/ drawable/ graphic.png layout/ main.xml info.xml mipmap/ icon.png values/ strings.xml raw/ myjsonfile.json
внутри
Activity
, файл json можно получить черезR
(ресурсы) класс, и читать в строку:Context context = this; Inputstream inputStream = context.getResources().openRawResource(R.raw.myjsonfile); String jsonString = new Scanner(inputStream).useDelimiter("\A").next();
это использует класс Java
Scanner
, что приводит к менее строки кода, чем некоторые другие методы чтения простого текстового / json-файла. Шаблон разделителя\A
означает "начало ввода"..next()
считывает следующий токен, который в данном случае является целым файлом.есть несколько способов проанализировать полученную строку json:
- используйте Java / Android встроенный JSONObject и JSONArray объекты, как здесь: итерация массива JSON в Android / Java. Может быть удобно добираться строк, чисел и т. д. используя
optString(String name)
,optInt(String name)
etc. методы, а неgetString(String name)
,getInt(String name)
методы, потому чтоopt
методы возвращают null вместо исключения в случае сбоя.- используйте Java / Android JSON сериализации / десериализации библиотеки, как те, которые упоминаются здесь:https://medium.com/@IlyaEremin/android-json-parsers-comparison-2017-8b5221721e31