我的目的是创建使用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)
}
我尝试了很多事情通过单元测试,但不幸的是我无法成功:(