科特林反射

时间:2018-12-07 19:51:19

标签: android json generics kotlin

我的目的是创建使用JSONObject和JSONArray(package:org.json)的json解析器函数。在解析器函数中,我想将json字符串和json模型作为参数传递给函数,它将通过反射返回带有json字段填充的引用类 (我知道有很多json库可用,但我不想使用它们)

JsonParser示例代码

class JsonParser {

    fun <T : Any> parse(json: String, clazz: KClass<T>): T? {
        if (json.startsWith("{")) {
            val jsonObject = JSONObject(json)

            for (declaredField in clazz.java.declaredFields) {
                val fieldClass = clazz.java.declaredFields.first().genericType as Class<*>

                if (fieldClass.isAssignableFrom(String::class.java)) {
                    val stingField = jsonObject.getString(declaredField.name)

                } else if (fieldClass.isAssignableFrom(Int::class.java)) {
                    val intField = jsonObject.getString(declaredField.name)

                } else if (fieldClass.isAssignableFrom(List::class.java)) {
                    val jsonArray = jsonObject.getJSONArray(declaredField.name)

                    //call recursively ....  parser
                }

            }


        }

    //TODO create instance from class parameter and fill its members

        return null
    }
}

基本功能是遍历类字段并检查其类型并从json对象或json arrray获取。

样本json “ {”名称“:” gokhan“,”年龄“:1,”朋友“:[{”名称“:” ahmet“}]}”“

Kotlin数据模型

class Friend(val name: String)

class Student(val name: String, val age: Int, val friends: List<Friend>)

单元测试

@Test
    fun shouldParseJsonCorrectly() {
        val expectedName = "gokhan"
        val input = "{\"name\":\"gokhan\",\"age\":1,\"friends\":[{\"name\":\"ahmet\"}]}"
        val student = JsonParser().parse(input, Student::class)

        assertTrue(expectedName == student?.name)
    }

我尝试了很多事情通过单元测试,但不幸的是我无法成功:(

0 个答案:

没有答案