【问题标题】:Convert existing List into a json/text file so moving forward read the data from that file to generate the List将现有列表转换为 json/文本文件,以便向前读取该文件中的数据以生成列表
【发布时间】:2020-02-07 07:21:38
【问题描述】:

如何将此List<Any> 更改为 text/json 文件然后读取它? 由于此常见问题解答问题和答案将被硬编码,因此我不希望将其直接设置在我的片段中。我打算将信息放入资产文件中,然后从那里读取以生成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&lt;Any&gt;得到

【问题讨论】:

    标签: android list kotlin any


    【解决方案1】:

    如果您的 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
        }
    }
    

    【讨论】:

    • 谢谢,这正是我想要做的。我比较新,所以不知道地图之类的东西。
    猜你喜欢
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    相关资源
    最近更新 更多