Котлин Отражение - PullRequest
       2

Котлин Отражение

0 голосов
/ 07 декабря 2018

Моя цель - создать функцию парсера 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)
    }

Я много чего пытался пройти модульный тест, но, к сожалению, у меня ничего не получилось: (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...