Misalkan saya memiliki file dengan konten JSON di folder sumber daya mentah di aplikasi saya. Bagaimana saya bisa membaca ini ke dalam aplikasi, sehingga saya bisa mengurai JSON?
88
Lihat openRawResource . Sesuatu seperti ini seharusnya bekerja:
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();
\res\json_file.json
folder atau di dalam\res\raw\json_file.json
?getResources()
dipanggil? Di mana file sumber daya mentah harus disimpan? Konvensi apa yang harus Anda ikuti untuk memastikan alat build dibuatR.raw.json_file
?Kotlin sekarang menjadi bahasa resmi untuk Android, jadi menurut saya ini akan berguna bagi seseorang
val text = resources.openRawResource(R.raw.your_text_file) .bufferedReader().use { it.readText() }
sumber
Saya menggunakan jawaban @ kabuko untuk membuat objek yang dimuat dari file JSON, menggunakan Gson , dari Resources:
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); } }
Untuk menggunakannya, Anda akan melakukan sesuatu seperti berikut (contohnya dalam an
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); }
sumber
implementation 'com.google.code.gson:gson:2.8.5'
Dari http://developer.android.com/guide/topics/resources/providing-resources.html :
sumber
Seperti status @mah, dokumentasi Android ( https://developer.android.com/guide/topics/resources/providing-resources.html ) mengatakan bahwa file json dapat disimpan di direktori / raw di bawah / res (resources) direktori dalam proyek Anda, misalnya:
MyProject/ src/ MyActivity.java res/ drawable/ graphic.png layout/ main.xml info.xml mipmap/ icon.png values/ strings.xml raw/ myjsonfile.json
Di dalam
Activity
, file json dapat diakses melalui kelasR
(Resources), dan dibaca ke String:Context context = this; Inputstream inputStream = context.getResources().openRawResource(R.raw.myjsonfile); String jsonString = new Scanner(inputStream).useDelimiter("\\A").next();
Ini menggunakan kelas Java
Scanner
, yang mengarah ke lebih sedikit baris kode daripada beberapa metode lain untuk membaca file teks / json sederhana. Pola pembatas\A
berarti 'awal masukan'..next()
membaca token berikutnya, yang merupakan keseluruhan file dalam kasus ini.Ada beberapa cara untuk mengurai string json yang dihasilkan:
optString(String name)
,optInt(String name)
dll metode, bukangetString(String name)
,getInt(String name)
metode, karenaopt
metode kembali nol bukan pengecualian dalam kasus gagal.sumber
import java.util.Scanner; import java.io.InputStream; import android.content.Context;
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");
sumber
Menggunakan:
String json_string = readRawResource(R.raw.json)
Fungsi:
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() : ""; }
sumber
Menemukan jawaban cuplikan Kotlin ini sangat membantu ♥ ️
Sementara pertanyaan asli meminta untuk mendapatkan String JSON, saya pikir beberapa mungkin menganggap ini berguna. Selangkah lebih maju dengan
Gson
mengarah ke fungsi kecil ini dengan tipe yang direifikasi:private inline fun <reified T> readRawJson(@RawRes rawResId: Int): T { resources.openRawResource(rawResId).bufferedReader().use { return gson.fromJson<T>(it, object: TypeToken<T>() {}.type) } }
Catatan Anda ingin menggunakan
TypeToken
tidak hanyaT::class
jadi jika Anda membacaList<YourType>
Anda tidak akan kehilangan jenis demi jenis penghapusan.Dengan jenis inferensi, Anda dapat menggunakan seperti ini:
fun pricingData(): List<PricingData> = readRawJson(R.raw.mock_pricing_data)
sumber