【问题标题】:Reading JSON from file using GSON in Android Studio在 Android Studio 中使用 GSON 从文件中读取 JSON
【发布时间】:2020-06-27 19:13:44
【问题描述】:

我正在尝试将 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));

但是,我得到了错误

无法解析方法 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

【问题讨论】:

  • 替换行 = reader.readLine();在while循环内
  • @Kirguduck 那部分工作正常。但是将阅读器放在 while 循环中并不会改变 GSON 错误
  • 如果你使用 line = reader.readLine(); out of loop 那么你将只读取 json 的第一行。添加日志并检查 - 你读了什么。现在你只读取了 json 的一部分,看起来这是错误的原因

标签: java android json android-studio gson


【解决方案1】:

Gson 为 fromJson 方法提供了很多重载,这里是它们的签名:

但正如您所见,它们都没有将 StringBuilder 作为第一个参数。这就是编译器所抱怨的。相反,您有将 String 作为第一个参数的构造函数。

所以替换这一行:

walletList.add(new Gson().fromJson(data, walletListType));

与:

walletList.add(new Gson().fromJson(data.toString(), walletListType));

你应该很高兴。

【讨论】:

  • 是的,我试过了,但没有用。我已经有:data.toString();
  • 您在使用data.toString() 时收到什么错误消息?显然不一样吧?
  • 我的错误,它确实解决了它。我假设在fromJson 方法之外有data.toString() 它仍然可以工作,但由于某种原因它不会。干杯
【解决方案2】:

您可以使用 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
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    相关资源
    最近更新 更多