Android 앱 리소스에서 JSON 파일 사용
앱의 원시 리소스 폴더에 JSON 내용이 포함된 파일이 있다고 가정합니다.어떻게 하면 JSON을 해석할 수 있을까요?
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();
Kotlin은 현재 Android의 공용어이기 때문에 누군가에게 도움이 될 것 같습니다.
val text = resources.openRawResource(R.raw.your_text_file)
.bufferedReader().use { it.readText() }
@kabuko의 답변을 사용하여 리소스에서 Gson을 사용하여 JSON 파일에서 로드하는 개체를 만들었습니다.
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);
}
@mah 상태와 마찬가지로 Android 문서(https://developer.android.com/guide/topics/resources/providing-resources.html)에 따르면 json 파일은 프로젝트의 /res(filename) 디렉토리 아래의 /raw 디렉토리에 저장될 수 있습니다.다음은 예를 제시하겠습니다.
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
(리소스) 클래스 및 문자열 읽기:
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 문자열을 구문 분석하는 방법은 여러 가지가 있습니다.
- JSONObject 및 JSONArray 객체에 내장된 Java/Android를 사용합니다. Android/Java에서 JSON Array 반복을 사용합니다.스트링, 정수 등을 사용하는 것이 편리할 수 있습니다.
optString(String name)
,optInt(String name)
기타 방법, 즉getString(String name)
,getInt(String name)
메서드, 왜냐하면opt
메서드는 실패 시 예외 대신 null을 반환합니다. - https://medium.com/@IlyaEremin/android-json-parsers-comparison-2017-8b5221721e31과 같은 Java/Android json 직렬화/직렬화 라이브러리를 사용합니다.
http://developer.android.com/guide/topics/resources/providing-resources.html 에서 :
미가공/
원시 형식으로 저장할 임의 파일입니다.원시 InputStream에서 이러한 리소스를 열려면 리소스 ID(R.raw.filename)를 사용하여 Resources.openRawResource()를 호출합니다.다만, 원래의 파일명과 파일 계층에 액세스 할 필요가 있는 경우는, (res/raw/ 대신에) 일부의 자원을 자산/디렉토리에 보존하는 것을 검토해 주세요.자산의 파일/에는 리소스 ID가 부여되지 않으므로 Asset Manager를 통해서만 파일을 읽을 수 있습니다.
이 Kotlin의 단편적인 답변이 매우 도움이 되었습니다♥http
원래 질문에서는 JSON String을 가져오라고 했지만, 도움이 되는 질문도 있을 것 같습니다. with a a에서 한 걸음 더 Gson
으로 이어집니다.
private inline fun <reified T> readRawJson(@RawRes rawResId: Int): T {
resources.openRawResource(rawResId).bufferedReader().use {
return gson.fromJson<T>(it, object: TypeToken<T>() {}.type)
}
}
: 「 」를 사용합니다.TypeToken
.T::class
이 글을 a를 읽으실 수 .List<YourType>
을 사용법
유형 추론에서는 다음과 같이 사용할 수 있습니다.
fun pricingData(): List<PricingData> = readRawJson(R.raw.mock_pricing_data)
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");
사용방법:
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() : "";
}
언급URL : https://stackoverflow.com/questions/6349759/using-json-file-in-android-app-resources
'programing' 카테고리의 다른 글
npm 링크에 연결된 패키지가 업데이트되지 않습니다. (0) | 2023.03.16 |
---|---|
Woocommerce 제품갤러리 이미지 URL을 입수하는 방법 (0) | 2023.03.16 |
React 16의 fragments가 container div보다 나은 이유는 무엇입니까? (0) | 2023.03.16 |
TypeError: $scope.apply는 함수가 아닙니다. (0) | 2023.03.16 |
반응 환원 용기 구성요소로 전달 소품 (0) | 2023.03.16 |