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

Java 在Android Studio中使用GSON从文件读取JSON,java,android,json,android-studio,gson,Java,Android,Json,Android Studio,Gson,我试图将JSON从内部存储文件读入对象列表 我读取文件和GSON的代码是: fis = openFileInput(filename); BufferedReader reader = new BufferedReader(new InputStreamReader(fis)); StringBuilder data = new StringBuilder(); String line = null; line = reader.readLine(); while (line != nu

我试图将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));

我知道一个常见的修复方法是将导入代码从
org
更改为
com
,但是我已经确定它是
com

Gson为
fromJson
方法提供了大量重载,以下是它们的签名:

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

因此,替换这一行:

walletList.add(new Gson().fromJson(data, 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()
  }
}
类MyTypeAdapter:TypeAdapter(){
@抛出(IOException::类)
覆盖趣味阅读(reader:JsonReader):YourData{
变量元素1
变量元素2
reader.beginObject()
while(reader.hasNext()){
何时(reader.nextName()){
“element1”->latitude=reader.nextDouble()
“element2”->dropMessage=reader.nextString()
}
}
reader.endObject()
返回数据(元素1、元素2)
}
@抛出(IOException::类)
重写有趣的写入(out:JsonWriter,yourData:yourData){
out.beginObject()
out.name(“element1”).value(您的数据)
out.name(“element2”).value(您的数据)
out.endObject()
}
}
用法(读写)

fun saveData(yourData:yourData){
val string=gson.toJson(yourData)
试一试{
val数据流=数据输出流(yourData)
yourStream.write(string.toByteArray())
yourStream.close()
}捕获(e:IOException){
Log.e(“文件存储库”,“错误”)
}
}
fun getData():列表{
val data=mutableListOf()
试一试{
val fileList=dataDirectory().list()
fileList.map{convertStreamToString(YourDataInputStream(it))}.mapTo(数据){
fromJson(it,YourData::class.java)
}
}捕获(e:IOException){
Log.e(“文件存储库”,“错误”)
}
返回数据
}

replace line=reader.readLine();里边loop@Kirguduck那部分很好用。但是如果使用line=reader.readLine(),那么将读取器放入while循环不会改变关于GSON错误的任何内容;然后,您将只读取json的第一行。添加日志并检查-您阅读的内容。现在你只读了json的一部分,看起来这是错误的原因。是的,我试过了,但没有成功。我已经有:
data.toString()使用
data.toString()
时会收到什么错误消息?显然不一样,对吧?我的错误,它解决了它。我假设在json
方法的
之外有
data.toString()
,它仍然可以工作,但是由于某种原因它不能工作。干杯
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
  }