Supposons que j'ai un fichier avec le contenu JSON dans le dossier des ressources brutes de mon application. Comment puis-je lire ceci dans l'application, afin que je puisse analyser le JSON?
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();
Kotlin est maintenant la langue officielle pour Android, je pense donc que ce serait utile pour quelqu'un
val text = resources.openRawResource(R.raw.your_text_file)
.bufferedReader().use { it.readText() }
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 ceci (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);
}
De http://developer.Android.com/guide/topics/resources/providing-resources.html :
raw/
Fichiers arbitraires à sauvegarder sous leur forme brute. Pour ouvrir ces ressources avec un InputStream brut, appelez Resources.openRawResource () avec l'ID de ressource, qui est R.raw.filename.Toutefois, si vous avez besoin d'accéder aux noms de fichiers d'origine et à la hiérarchie des fichiers, vous pouvez envisager de sauvegarder certaines ressources dans le répertoire assets/(au lieu de res/raw /). Les fichiers des actifs/ne reçoivent pas d'ID de ressource, vous pouvez donc les lire uniquement à l'aide de AssetManager.
Comme @mah déclare, la Android documentation ( https://developer.Android.com/guide/topics/resources/providing-resources.html ) indique que les fichiers json peuvent être enregistrés dans le répertoire/raw sous le répertoire/res (ressources) 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 est accessible via la classe R
(ressources) et lu dans un String:
Context context = this;
Inputstream inputStream = context.getResources().openRawResource(R.raw.myjsonfile);
String jsonString = new Scanner(inputStream).useDelimiter("\\A").next();
Ceci utilise le Java classe Scanner
, conduisant à moins de lignes de code que certaines autres méthodes de lecture d'un simple fichier texte/json. Le motif de délimitation \A
Signifie 'le début de l'entrée'. .next()
lit le jeton suivant, qui est le fichier entier dans ce cas.
Il existe plusieurs façons d’analyser la chaîne json obtenue:
optString(String name)
, optInt(String name)
etc., et non les méthodes getString(String name)
, getInt(String name)
, car les méthodes opt
les méthodes renvoient null au lieu d'une exception en cas d'échec.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");
avec:
String json_string = readRawResource(R.raw.json)
Fonctions:
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() : "";
}