org.json的导入:

build.gradle.ktsdependencies {}中加上

implementation("org.json:org.json:chargebee-1.0")

或者:

implementation 'org.json:org.json:chargebee-1.0'

具体添加方式和最新版本在Maven Central: org.json:org.json上看就行。

JSON保存.json文件

JSONObject

创建方式:

// 创建空JSONObject
val obj = JSONObject()
// 根据具体文本创建
val obj = JSONObject("""{"name": "张三", "age": 65}""")

保存方式:

val obj = JSONObject()
obj.put("name", "张三")
obj.put("age", 65)
val f = File("./data.json")
f.writeText(obj.toString()) //覆盖

读取方法:

// 根据具体文本创建
val obj = JSONObject("""{"name": "张三", "age": 65}""")
// 根据前项读取
val name = obj.getString("name") // 张三
val age = obj.getInt("age") // 65

JSONArray

创建方法与JSONObject相同,但是一次put的时候只能放一个参数,读取的时候根据.get(index: Int)获得,实例如下:

val arr = JSONArray()
arr.put("张三").put("李四").put("马五")
f.writeText(arr.toString())
for(i in 0 until arr.length()) {
    arrList.add(arr.getString(i))
}

println(arr) // ["张三","李四","马五"]
println(arrList) // [张三, 李四, 马五]

当然,JSONArray中可以放JSONArray对象和JSONObject对象,(get()返回的是Any也差不多就是java得Object,需要自己强转类型,自己写个函数对应数据类其实也行),实例:

data class StudentData(val name: String, val age: Int)
fun getStudentDataFormJSON(json: String): StudentData {
    val obj = JSONObject(json)
    return StudentData(obj.getString("name"), obj.getInt("age"))
}
fun studentDataToJSON(data: StudentData): JSONObject{
    val obj = JSONObject()
    obj.put("name", data.name)
    obj.put("age", data.age)
    return obj
}
fun getData(file: File): MutableList<StudentData> {
    val arr = JSONArray(file.readText())
    val sdList = mutableListOf<StudentData>()
    for (i in 0 until arr.length()) {
        sdList.add(getStudentDataFormJSON(arr.get(i).toString()))
    }
    return sdList
}

fun main() {
    val f = File("./data.json")
    val arr = JSONArray()
    arr.put(studentDataToJSON(StudentData("张三", 65)))
    arr.put(studentDataToJSON(StudentData("李四", 25)))
    arr.put(studentDataToJSON(StudentData("马五", 5)))
    f.writeText(arr.toString())
    
    val sdList = getData(f)
    sdList.forEach { println(it.toString()) }
    /* StudentData(name=张三, age=65)
    StudentData(name=李四, age=25)
    StudentData(name=马五, age=5)
    */
}

Android

Android自带org.json,因此不用导入,使用方式也和如上无差,只是在得到File对象时可以用

LocalContext.current.getExternalFilesDir(null) // 获得".../Android/data/你的包名"的File对象
val f = File(context.getExternalFilesDir(null), "data.txt")

差不多就是这样。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐