将现有列表转换为json /文本文件,因此向前读取该文件中的数据以生成列表

问题描述 投票:0回答:1

如何将List<Any>更改为text / json文件,然后阅读?由于此FAQ问题和答案将被硬编码,因此,我不希望将其直接设置在片段中。我打算将信息放入资产文件中,然后从那里读取信息以生成List

我的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>

android list kotlin any
1个回答
0
投票

如果您的json仅包含StringFAQ元素

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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.