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);
}
}
8条答案
按热度按时间fxnxkyjh1#
请参见openRawResource。类似下面的代码应该可以工作:
xbp102n02#
Kotlin现在是Android的官方语言,所以我认为这对某些人会很有用
qkf9rpyu3#
我使用@kabuko的答案创建了一个从JSON文件加载的对象,使用的是参考资料中的Gson:
要使用它,您需要执行以下操作(示例在
InstrumentationTestCase
中):g52tjvyc4#
与@mah一样,Android文档(https://developer.android.com/guide/topics/resources/providing-resources.html)指出json文件可以保存在项目中/res(resources)目录下的/raw目录中,例如:
在
Activity
中,可以通过R
(资源)类访问json文件,并将其读取为String:这使用了Java类
Scanner
,与其他阅读简单文本/ json文件的方法相比,使用了更少的代码行。分隔符模式\A
表示“输入的开始”。.next()
读取下一个标记,在本例中是整个文件。有多种方法可以解析生成的JSON字符串:
optString(String name)
、optInt(String name)
等方法而不是getString(String name)
、getInt(String name)
方法来获得字符串、整数等可能是方便的,因为opt
方法在失败的情况下返回空值而不是异常。qjp7pelc5#
从http://developer.android.com/guide/topics/resources/providing-resources.html开始:
要以原始格式保存的任意文件。要使用原始InputStream打开这些资源,请使用资源ID(即R.raw.filename)调用Resources. openRawResource()。
但是,如果您需要访问原始文件名和文件层次结构,您可以考虑将一些资源保存在assets/目录(而不是res/raw/)中。assets/中的文件没有资源ID,因此您只能使用AssetManager读取它们。
m0rkklqb6#
找到了this Kotlin snippet answer very helpful️
虽然最初的问题是获取JSON字符串,但我想有些人可能会觉得这很有用。进一步使用
Gson
会得到这个具有具体化类型的小函数:请注意,您希望使用
TypeToken
,而不仅仅是T::class
,因此如果您读取List<YourType>
,您不会逐个类型地丢失擦除。通过类型推断,你可以像这样使用:
5vf7fwbs7#
watbbzwu8#
使用:
功能: