Как использовать JSONObject из Kotlin JS - PullRequest
0 голосов
/ 10 июля 2020

Я новичок в Kotlin JS.

Я пытаюсь перенести бизнес-лог c моего приложения android на Kotlin JS.

Мое приложение использует класс org. json .JsonObject для пользовательской сериализации. Я не могу использовать сериализацию KotlinX с аннотациями, потому что мои классы встроены, и эти аннотации не поддерживаются.

Проект Kotlin - JS использует Gradle Kotlin DSL. Я указываю зависимость как «реализация (организация json: json: 20190722») ». Компилятор выдает ошибку «неразрешенная ссылка» для чего-либо из библиотеки. Я подозреваю, что такое связывание с библиотекой java для Kotlin - JS является незаконным. Это правда?

Как лучше всего реализовать JsonObject в моем приложении? Нужно ли мне копировать исходный код в свой проект и самому скомпилировать его в JS?

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 10 июля 2020

Если вы не хотите использовать аннотации в библиотеке kotlinx.serizalization, вы все равно можете включить их в свои платформы android и js.

Вам просто нужно будет построить и использовать тип JsonObject, который присутствует на обеих платформах вручную.

Вы можете увидеть определение JsonObject в библиотеке здесь:

https://github.com/Kotlin/kotlinx.serialization/blob/ffe216f0293231b09eea24a10aa4bc26ff6d5b90/runtime/commonMain/src/kotlinx/serialization/json/JsonElement.kt#L217

Вот пример создания JsonObject вручную с использованием классов kotlinx.serialization

data class AnalyticsEvent(
    val name: Event,
    val columns: Map<Column, JsonPrimitive>? = null,
    val properties: Map<Property, JsonElement>? = null
) : LoggingEvent() {
    override fun toJson(): JsonObject {
        val content: MutableMap<String, JsonElement> = mutableMapOf()

        content[EVENT_NAME_KEY] = JsonPrimitive(name.actual)

        val columnJSON = columns?.mapKeys { it.key.actual }
        columnJSON?.let {
            content[EVENT_COLUMNS_KEY] = JsonObject(columnJSON)
        }

        val propertiesJSON = properties?.mapKeys { it.key.actual }
        propertiesJSON?.let {
            content[EVENT_PROPERTIES_KEY] = JsonObject(propertiesJSON)
        }

        return JsonObject(content)
    }
...