Преобразуйте существующий список в файл json / text, чтобы двигаться вперед, считывая данные из этого файла, чтобы создать список - PullRequest
1 голос
/ 07 февраля 2020

Как мне преобразовать этот List<Any> в текстовый / json файл и затем прочитать его? Поскольку этот вопрос и ответ на часто задаваемые вопросы будут жестко закодированы, поэтому я не хочу, чтобы он был установлен непосредственно внутри моего фрагмента. Я планирую поместить информацию в файл активов, а затем прочитать ее оттуда, чтобы сгенерировать List

My List<Any>

val list: List<Any> = arrayListOf(
        "General",
        FAQ(faqQuestion = "ABC?", faqAnswer = "QWERTY", expanded = false),
        FAQ(faqQuestion = "DEF?", faqAnswer = "ZXCVBN", expanded = false),
        "Troubleshooting",
        FAQ(faqQuestion = "ZXC?", faqAnswer = "POIUYT", expanded = false)
)

Я не знаю, как конвертировать это в JSON или текстовый файл и успешно экспортировать его в этот List.

До сих пор я пробовал:

faq.json

[
  "General",
  {
    "expanded":false,
    "faqQuestion":"ABC?",
    "faqAnswer":"QWERTY"
  },
  {
    "expanded":false,
    "faqQuestion":"DEF?",
    "faqAnswer":"ZXCVBN"
  }
]

Текстовый файл faq.txt

"General",
FAQ(faqQuestion = "ABC?", faqAnswer = "QWERTY", expanded = false),
FAQ(faqQuestion = "DEF?", faqAnswer = "ZXCVBN", expanded = false),
"Troubleshooting",
FAQ(faqQuestion = "ZXC?", faqAnswer = "POIUYT", expanded = false)

Код для получения активов: Текст

fun loadFromAsset(fileName: String, context: Context): Any? {
    val any: Any
    try {
        val ins = context.getAssets().open(fileName)
        val size = ins.available()
        val buffer = ByteArray(size)
        ins.read(buffer)
        ins.close()
        any = String(buffer, Charset.forName("UTF-8"))
    } catch (ex: IOException) {
        ex.printStackTrace()
        return null
    }

    return any
}

var list: List<Any>?
loadFromAsset("faq.txt", requireContext())?.let {
    list = arrayListOf(it)
}

JSON

fun loadFromAsset(fileName: String, context: Context): String? {
    var json: String? = null
    try {
        val ins = context.getAssets().open(filename)
        val size = ins.available()
        val buffer = ByteArray(size)
        ins.read(buffer)
        ins.close()
        json = String(buffer, Charset.forName("UTF-8"))
    } catch (ex: IOException) {
        ex.printStackTrace()
        return null
    }

    return json
}

val list: List<Any> = Gson().fromJson(loadFromAsset("faq.json", requireContext()), Array<Any>::class.java).asList()

Оба способа не могут быть получены в соответствии с оригиналом List<Any>

1 Ответ

2 голосов
/ 07 февраля 2020

Если ваш json содержит только String и FAQ элементы

val list: List<Any> = gson.fromJson(json, JsonArray::class.java).map {
    when (it) {
        is JsonPrimitive -> it.asString as Any
        else -> gson.fromJson(it, FAQ::class.java) as Any
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...