在 Android Studio 中使用 GSON 从文件读取 JSON
Reading JSON from file using GSON in Android Studio
我正在尝试将 JSON 从内部存储文件读取到对象列表中。
我读取文件的代码和GSON
是:
fis = openFileInput(filename);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
StringBuilder data = new StringBuilder();
String line = null;
line = reader.readLine();
while (line != null)
{
data.append(line).append("\n");
}
data.toString();
reader.close();
fis.close();
Type walletListType = new TypeToken<ArrayList<WalletClass>>(){}.getType();
walletList.add(new Gson().fromJson(data, walletListType));
但是,我遇到了错误
Cannot resolve method fromJson('java.lang.stringBuilder,
java.lang.reflect.Type')
我要加载的 JSON 是(它在方括号内,因为我已经从对象列表中序列化了它):
[
{"balance":258,"walletName":"wallet 1"},
{"balance":5222,"walletName":"wallet 2"},
{"balance":1,"walletName":"wallet 3"}
]
我知道一个常见的解决方法是将导入代码从 org
更改为 com
,但我已经确定它是 com
。
Gson 为 fromJson
方法提供了很多重载,这里是它们的签名:
但如您所见,其中 none 将 StringBuilder 作为第一个参数。这就是编译器所抱怨的。相反,您有将 String 作为第一个参数的构造函数。
所以替换这一行:
walletList.add(new Gson().fromJson(data, walletListType));
与:
walletList.add(new Gson().fromJson(data.toString(), walletListType));
你应该可以开始了。
您可以使用GSON的类型适配器来读写文件。
我是用kotlin写的,希望对你有帮助
val builder = GsonBuilder()
builder.registerTypeAdapter(YourData::class.java, MyTypeAdapter())
return builder.create()
样本类型适配器
class MyTypeAdapter : TypeAdapter<YourData>() {
@Throws(IOException::class)
override fun read(reader: JsonReader): YourData {
var element1
var element2
reader.beginObject()
while (reader.hasNext()) {
when (reader.nextName()) {
"element1" -> latitude = reader.nextDouble()
"element2" -> dropMessage = reader.nextString()
}
}
reader.endObject()
return YourData(element1, element2)
}
@Throws(IOException::class)
override fun write(out: JsonWriter, yourData: YourData) {
out.beginObject()
out.name("element1").value(yourData)
out.name("element2").value(yourData)
out.endObject()
}
}
用法(读写)
fun saveData(yourData: YourData) {
val string = gson.toJson(yourData)
try {
val dataStream = dataOutputStream(yourData)
yourStream.write(string.toByteArray())
yourStream.close()
} catch (e: IOException) {
Log.e("FileRepository", "Error")
}
}
fun getData(): List<YourData> {
val data = mutableListOf<YourData>()
try {
val fileList = dataDirectory().list()
fileList.map { convertStreamToString(YourDataInputStream(it)) }.mapTo(data) {
gson.fromJson(it, YourData::class.java)
}
} catch (e: IOException) {
Log.e("FileRepository", "Error")
}
return data
}
我正在尝试将 JSON 从内部存储文件读取到对象列表中。
我读取文件的代码和GSON
是:
fis = openFileInput(filename);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
StringBuilder data = new StringBuilder();
String line = null;
line = reader.readLine();
while (line != null)
{
data.append(line).append("\n");
}
data.toString();
reader.close();
fis.close();
Type walletListType = new TypeToken<ArrayList<WalletClass>>(){}.getType();
walletList.add(new Gson().fromJson(data, walletListType));
但是,我遇到了错误
Cannot resolve method fromJson('java.lang.stringBuilder, java.lang.reflect.Type')
我要加载的 JSON 是(它在方括号内,因为我已经从对象列表中序列化了它):
[
{"balance":258,"walletName":"wallet 1"},
{"balance":5222,"walletName":"wallet 2"},
{"balance":1,"walletName":"wallet 3"}
]
我知道一个常见的解决方法是将导入代码从 org
更改为 com
,但我已经确定它是 com
。
Gson 为 fromJson
方法提供了很多重载,这里是它们的签名:
但如您所见,其中 none 将 StringBuilder 作为第一个参数。这就是编译器所抱怨的。相反,您有将 String 作为第一个参数的构造函数。
所以替换这一行:
walletList.add(new Gson().fromJson(data, walletListType));
与:
walletList.add(new Gson().fromJson(data.toString(), walletListType));
你应该可以开始了。
您可以使用GSON的类型适配器来读写文件。 我是用kotlin写的,希望对你有帮助
val builder = GsonBuilder()
builder.registerTypeAdapter(YourData::class.java, MyTypeAdapter())
return builder.create()
样本类型适配器
class MyTypeAdapter : TypeAdapter<YourData>() {
@Throws(IOException::class)
override fun read(reader: JsonReader): YourData {
var element1
var element2
reader.beginObject()
while (reader.hasNext()) {
when (reader.nextName()) {
"element1" -> latitude = reader.nextDouble()
"element2" -> dropMessage = reader.nextString()
}
}
reader.endObject()
return YourData(element1, element2)
}
@Throws(IOException::class)
override fun write(out: JsonWriter, yourData: YourData) {
out.beginObject()
out.name("element1").value(yourData)
out.name("element2").value(yourData)
out.endObject()
}
}
用法(读写)
fun saveData(yourData: YourData) {
val string = gson.toJson(yourData)
try {
val dataStream = dataOutputStream(yourData)
yourStream.write(string.toByteArray())
yourStream.close()
} catch (e: IOException) {
Log.e("FileRepository", "Error")
}
}
fun getData(): List<YourData> {
val data = mutableListOf<YourData>()
try {
val fileList = dataDirectory().list()
fileList.map { convertStreamToString(YourDataInputStream(it)) }.mapTo(data) {
gson.fromJson(it, YourData::class.java)
}
} catch (e: IOException) {
Log.e("FileRepository", "Error")
}
return data
}