Чтение JSON из файла с использованием GSON в Android Studio - PullRequest
1 голос
/ 16 марта 2020

Я пытаюсь прочитать 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));

Однако я получаю сообщение об ошибке

Невозможно разрешить метод из Json ('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.

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Gson предоставляет много перегрузок для метода fromJson, вот их подписи:

fromJson overloads

Но, как вы можете видеть, ни один из они принимают StringBuilder в качестве первого аргумента. Это то, на что жалуется компилятор. Вместо этого у вас есть конструкторы, которые принимают строку в качестве первого аргумента.

Так что замените эту строку:

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

на:

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

И вам следует хорошо go.

0 голосов
/ 16 марта 2020

Вы можете использовать адаптер типа 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
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...