Utilisation du fichier JSON dans les ressources de L'application Android

supposons que j'ai un fichier avec des contenus JSON dans le dossier des ressources brutes de mon application. Comment puis-je lire ceci dans l'application, pour que je puisse analyser le JSON?

61
demandé sur yydl 2011-06-15 00:33:30

6 réponses

Voir openRawResource . Quelque chose comme ça devrait marcher:

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();
109
répondu kabuko 2011-06-14 20:46:30

Kotlin est maintenant la langue officielle pour Android, donc je pense que ce serait utile pour quelqu'un

val text = resources.openRawResource(R.raw.your_text_file)
                                 .bufferedReader().use { it.readText() }
34
répondu Dima Rostopira 2017-06-09 14:57:06

j'ai utilisé la réponse de @kabuko pour créer un objet qui se charge à partir d'un fichier JSON, en utilisant Gson , à partir des ressources:

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

Pour l'utiliser, vous feriez quelque chose comme ce qui suit (l'exemple est dans un 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);
   }
22
répondu jwir3 2014-06-03 20:00:22

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

raw/

Fichiers arbitraires à sauvegarder sous leur forme brute. Pour ouvrir ces ressources avec une entrée brute, appelez Resources.openRawResource () avec le resource ID, qui est R. raw.filename.

cependant, si vous avez besoin d'accéder aux noms de fichiers originaux et à la hiérarchie de fichiers, vous pourriez envisager d'économiser certaines ressources dans le répertoire assets/(au lieu de res/raw/). Les fichiers dans assets / n'ont pas D'ID de ressource, donc vous pouvez les lire seulement en utilisant AssetManager.

11
répondu mah 2013-04-03 11:14:22
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");
2
répondu NickUnuchek 2017-01-17 09:42:24

comme @mah déclare, la documentation Android ( https://developer.android.com/guide/topics/resources/providing-resources.html ) dit que les fichiers json peuvent être sauvegardés dans le répertoire / raw dans le répertoire / res (resources) de votre projet, par exemple:

MyProject/
  src/ 
    MyActivity.java
  res/
    drawable/ 
        graphic.png
    layout/ 
        main.xml
        info.xml
    mipmap/ 
        icon.png
    values/ 
        strings.xml
    raw/
        myjsonfile.json

dans un Activity , le fichier json peut être consulté à travers la classe R (ressources), et lu à une chaîne de caractères:

Context context = this;
Inputstream inputStream = context.getResources().openRawResource(R.raw.myjsonfile);
String jsonString = new Scanner(inputStream).useDelimiter("\A").next();

cela utilise la classe Java Scanner , conduisant à moins de lignes de code que d'autres méthodes de lecture d'un simple fichier texte / json. Le motif délimiteur \A signifie "le début de l'entrée". .next() lit le jeton suivant, qui est le dossier entier dans ce cas.

il y a plusieurs façons d'analyser la chaîne JSON résultante:

1
répondu ʕ ᵔᴥᵔ ʔ 2018-03-27 08:22:42