英文:
Reading JSON from file using GSON in Android Studio
问题
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.toString(), walletListType));
However, I'm getting the error
Cannot resolve method fromJson('java.lang.stringBuilder,
java.lang.reflect.Type')
The JSON I'm trying to load is (it's inside the square brackets because I've serialized it from a list of objects):
[
{"balance":258,"walletName":"wallet 1"},
{"balance":5222,"walletName":"wallet 2"},
{"balance":1,"walletName":"wallet 3"}
]
I know a common fix for this is changing the import code from org
to com
, however, I've already made sure it is com
.
英文:
I'm trying to read JSON from an internal storage file into a list of objects.
My code for reading the file and GSON
is:
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));
However, I'm getting the error
> Cannot resolve method fromJson('java.lang.stringBuilder,
> java.lang.reflect.Type')
The JSON I'm trying to load is (it's inside the square brackets because I've serialized it from a list of objects):
[
{"balance":258,"walletName":"wallet 1"},
{"balance":5222,"walletName":"wallet 2"},
{"balance":1,"walletName":"wallet 3"}
]
I know a common fix for this is changing the import code from org
to com
, however I've already made sure it is com
.
答案1
得分: 1
以下是翻译好的部分:
the Gson提供了许多fromJson
方法的重载,以下是它们的签名:
但是正如你所见,它们中没有任何一个将StringBuilder作为第一个参数。这就是编译器所抱怨的内容。相反,你有一些以String作为第一个参数的构造函数。
因此,将这行代码:
walletList.add(new Gson().fromJson(data, walletListType));
替换为:
walletList.add(new Gson().fromJson(data.toString(), walletListType));
这样你应该就可以继续了。
英文:
the Gson provide a lot of overloads for the fromJson
method, here are their signatures:
But as you can see none of them takes the StringBuilder as first argument. That is what the compiler is complaining about. Instead you have constructors that take a String as first argument.
So replace this line:
walletList.add(new Gson().fromJson(data, walletListType));
with:
walletList.add(new Gson().fromJson(data.toString(), walletListType));
And you should be good to go.
答案2
得分: 0
你可以使用GSON的类型适配器(Type adapter)来读写文件。
我已经用Kotlin写了这部分代码,希望能对你有所帮助。
```kotlin
val builder = GsonBuilder()
builder.registerTypeAdapter(YourData::class.java, MyTypeAdapter())
return builder.create()
示例类型适配器(Type Adapter)
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
}
<details>
<summary>英文:</summary>
You can use GSON's Type adapter to read and write files.
I have written this in kotlin, I hope it helps you.
val builder = GsonBuilder()
builder.registerTypeAdapter(YourData::class.java, MyTypeAdapter())
return builder.create()
Sample Type Adapter
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()
}
}
Usage (Read & Write)
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
}
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论