使用GSON在Android Studio中从文件读取JSON。

huangapple 未分类评论68阅读模式
标题翻译

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(&quot;\n&quot;);
}

data.toString();

reader.close();
fis.close();

Type walletListType = new TypeToken&lt;ArrayList&lt;WalletClass&gt;&gt;(){}.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):

[
   {&quot;balance&quot;:258,&quot;walletName&quot;:&quot;wallet 1&quot;},
   {&quot;balance&quot;:5222,&quot;walletName&quot;:&quot;wallet 2&quot;},
   {&quot;balance&quot;:1,&quot;walletName&quot;:&quot;wallet 3&quot;}
]

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方法的重载,以下是它们的签名:

使用GSON在Android Studio中从文件读取JSON。

但是正如你所见,它们中没有任何一个将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:

使用GSON在Android Studio中从文件读取JSON。

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&#39;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 &amp; 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(&quot;FileRepository&quot;, &quot;Error&quot;)
}

return data

}


</details>



huangapple
  • 本文由 发表于 2020年3月17日 00:47:11
  • 转载请务必保留本文链接:https://java.coder-hub.com/60709964.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定