Моя цель - создать функцию парсера json, которая использует JSONObject и JSONArray (package: org.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.
Пример json"{" name ":" gokhan "," age ": 1," friends ": [{" name ":" 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)
}
Я много чего пытался пройти модульный тест, но, к сожалению, у меня ничего не получилось: (