Załóżmy, że mam plik z zawartością JSON w folderze surowych zasobów w mojej aplikacji. Jak mogę to wczytać do aplikacji, aby przeanalizować JSON?
87
Zobacz openRawResource . Coś takiego powinno działać:
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
folderze czy w środku\res\raw\json_file.json
?getResources()
zadzwonić? Gdzie powinien znajdować się surowy plik zasobów? Jakiej konwencji należy przestrzegać, aby narzędzia kompilacji tworzyłyR.raw.json_file
?Kotlin jest teraz oficjalnym językiem Androida, więc myślę, że przydałoby się to komuś
val text = resources.openRawResource(R.raw.your_text_file) .bufferedReader().use { it.readText() }
źródło
Użyłem odpowiedzi @ kabuko, aby utworzyć obiekt, który ładuje się z pliku JSON, używając Gson , z zasobów:
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); } }
Aby go użyć, wykonaj coś podobnego do następującego (przykład jest w
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); }
źródło
implementation 'com.google.code.gson:gson:2.8.5'
Z http://developer.android.com/guide/topics/resources/providing-resources.html :
źródło
Podobnie jak w przypadku @mah, dokumentacja Androida ( https://developer.android.com/guide/topics/resources/providing-resources.html ) mówi, że pliki json mogą być zapisywane w katalogu / raw w katalogu / res (zasoby) katalog w Twoim projekcie, na przykład:
MyProject/ src/ MyActivity.java res/ drawable/ graphic.png layout/ main.xml info.xml mipmap/ icon.png values/ strings.xml raw/ myjsonfile.json
Wewnątrz
Activity
pliku json można uzyskać dostęp za pośrednictwemR
klasy (Resources) i odczytać go w ciągu:Context context = this; Inputstream inputStream = context.getResources().openRawResource(R.raw.myjsonfile); String jsonString = new Scanner(inputStream).useDelimiter("\\A").next();
Wykorzystuje klasę Java
Scanner
, co prowadzi do mniejszej liczby wierszy kodu niż niektóre inne metody odczytu prostego pliku tekstowego / json. Wzorzec separatora\A
oznacza „początek danych wejściowych”..next()
czyta następny token, którym w tym przypadku jest cały plik.Istnieje wiele sposobów analizowania wynikowego ciągu JSON:
optString(String name)
,optInt(String name)
itp, a nie metodygetString(String name)
,getInt(String name)
metody, ponieważopt
metody zwracają NULL zamiast wyjątek w przypadku awarii.źródło
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");
źródło
Za pomocą:
String json_string = readRawResource(R.raw.json)
Funkcje:
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() : ""; }
źródło
Znaleziona odpowiedź fragmentu Kotlin jest bardzo pomocna ♥ ️
Podczas gdy pierwotne pytanie zadane w celu uzyskania ciągu JSON, wydaje mi się, że niektórzy mogą uznać to za przydatne. Krok dalej
Gson
prowadzi do tej małej funkcji w typie zreifikowanym:private inline fun <reified T> readRawJson(@RawRes rawResId: Int): T { resources.openRawResource(rawResId).bufferedReader().use { return gson.fromJson<T>(it, object: TypeToken<T>() {}.type) } }
Zauważ, że chcesz użyć
TypeToken
nie tylko,T::class
więc jeśli przeczytaszList<YourType>
, nie stracisz wymazywania typu po typie.Z wnioskiem o typie możesz użyć w następujący sposób:
fun pricingData(): List<PricingData> = readRawJson(R.raw.mock_pricing_data)
źródło