Использование файла JSON в ресурсах приложения для Android - PullRequest
75 голосов
/ 15 июня 2011

Предположим, у меня есть файл с содержимым JSON в папке сырых ресурсов в моем приложении.Как я могу прочитать это в приложении, чтобы я мог разобрать JSON?

Ответы [ 7 ]

131 голосов
/ 15 июня 2011

См. 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();
73 голосов
/ 09 июня 2017

Kotlin теперь является официальным языком для Android, поэтому я думаю, что это будет полезно для кого-то

val text = resources.openRawResource(R.raw.your_text_file)
                                 .bufferedReader().use { it.readText() }
22 голосов
/ 04 июня 2014

Я использовал ответ @ 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);
   }
11 голосов
/ 15 июня 2011

С http://developer.android.com/guide/topics/resources/providing-resources.html:

сырье /
Произвольные файлы для сохранения в необработанном виде. Чтобы открыть эти ресурсы с помощью необработанного InputStream, вызовите Resources.openRawResource () с идентификатором ресурса, который является R.raw.filename.

Однако, если вам нужен доступ к исходным именам файлов и файловой иерархии, вы можете рассмотреть вопрос о сохранении некоторых ресурсов в каталоге assets / (вместо res / raw /). Файлы в ресурсах / не имеют идентификатора ресурса, поэтому их можно прочитать только с помощью AssetManager.

7 голосов
/ 27 марта 2018

Как и @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 (Resources) и прочитать в строку:

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 Array в Android / Java . Может быть удобно получать строки, целые числа и т. Д., Используя методы optString(String name), optInt(String name) и т. Д., А не методы getString(String name), getInt(String name), поскольку методы opt возвращают ноль вместо исключения в случае терпит неудачу.
  • Используйте библиотеку Java / Android json для сериализации / десериализации, подобную приведенной здесь: https://medium.com/@IlyaEremin/android-json-parsers-comparison-2017-8b5221721e31
4 голосов
/ 17 января 2017
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");
0 голосов
/ 05 марта 2019

Использование:

String json_string = readRawResource(R.raw.json)

Функции:

public String readRawResource(@RawRes int res) {
    return readStream(context.getResources().openRawResource(res));
}

private String readStream(InputStream is) {
    Scanner s = new Scanner(is).useDelimiter("\\A");
    return s.hasNext() ? s.next() : "";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...