
рдПрдХ рдмрд╣реБ-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЬреЛ .framework рдФрд░ .ar рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд░рддреА рд╣реИ, рдореИрдВ рдЗрд╕ рдирддреАрдЬреЗ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд╕рд╛рд░реА рдЙрдкрдпреЛрдЧреА рдЪреАрдЬреЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдореЗрдВ рд╕реЗ рдХрдИ рд▓реЛрдЧ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдереЗред
рдорд▓реНрдЯреА-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдЬрд┐рди рдЪреАрдЬрд╝реЛрдВ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рд╡реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдбреЗрд╡рд▓рдк рдХрд░рддреЗ рд╕рдордп рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВред рдХреЛрдЯрд▓рд┐рди рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЛ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдЬрдм рдореИрдВ рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖ рдЧрдпрд╛ рдЬрдм рдПрдХ JSON рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдХреНрд░рдорд╛рдВрдХрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдЬреЛ рджреЛ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ (iOS рдФрд░ Android) рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рддреЛ iOS рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВред рдереЛрдбрд╝реА рдЦреЛрдЬ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ
рдХреЛрдЯрд▓рд┐рдиреИрдХреНрд╕ рд╕реАрд░рд┐рдпрд▓рд┐рдпрд▓рдЬрд╝реЗрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдорд┐рд▓реАред
рд╕рдЪ рдХрд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрднреА рдкрддрд╛ рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреНрд░рдХрд╛рд╢рди рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╣реИ, рдЬреЛ рдореЗрд░реА рддрд░рд╣ рд╣реА рдЗрд╕ рдЙрдкрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдереЗред
рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣
рд╕реЗ рдЧрд┐рдереБрдм рднрдВрдбрд╛рд░ рдореЗрдВ рд╡рд░реНрдгрд┐рдд
рд╣реИ ред рд▓реЗрдХрд┐рди рдореИрдВ рдПрдВрдбреНрд░реЙрдЗрдб рдФрд░ рдорд▓реНрдЯреА-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдЙрдкрдпреЛрдЧ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реВрдВрдЧрд╛ред
рдорд▓реНрдЯреА-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕рдВрдХрд▓рди рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рдореВрд▓ рдЧреНрд░реИрдВрдб рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред
implementation org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:0.9.1
рдмрд╣реБ-рдордВрдЪ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЧреНрд░реБрдВрдбрд▓ рдЙрджрд╛рд╣рд░рдг
plugins { id 'kotlin-multiplatform' version '1.3.11' id 'kotlinx-serialization' version '1.3.10' } repositories { google() jcenter() mavenCentral() maven { url "https://kotlin.bintray.com/kotlinx" } } apply plugin: 'com.android.library' apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 28 defaultConfig { minSdkVersion 15 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' androidTestImplementation 'com.android.support.test:runner:1.0.2' } kotlin { targets { fromPreset(presets.android, 'android')
Android рдХреЗ рд▓рд┐рдП
apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlinx-serialization' android { compileSdkVersion 28 defaultConfig { applicationId "com.example.smile.kotlinxretrosample" minSdkVersion 16 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.9.1" implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'com.android.support:design:28.0.0' implementation 'com.squareup.retrofit2:retrofit:2.5.0' implementation 'com.squareup.okhttp3:okhttp:3.12.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' }
рдХреНрд░рдордмрджреНрдзрддрд╛
рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЗрд╕рдХреЗ рд╕рд╛рдордиреЗ
@Serializable
рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝реЗрдВ
import kotlinx.serialization.Serializable @Serializable class Field { var length: Int = 0 var hint: String = "" var required: Boolean = false }
рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рднреА рдбреЗрдЯрд╛ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИредрдЕрдм, JSON рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
fun toObject(stringValue: String): Field { return JSON.parse(Field.serializer(), stringValue) } fun toJson(field: Field): String {
@Transient
рдФрд░ @Optional
рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд▓рд╛рдпрдХ рджреЛ рдЕрдиреНрдп рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВ:
@Transient
- @Transient
рдХрд┐ рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред@Optional
- рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдмрдВрдж рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдлрд╝реАрд▓реНрдб рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реЛрдиреЗ рдкрд░ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдЕрднреА рднреА рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
@Optional var isOptional: Boolean = false @Transient var isTransient: Boolean = false
рд░рд┐рдЯреНрд░реЛрдлрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Android рдЙрджрд╛рд╣рд░рдг
рдЬреЛ рд▓реЛрдЧ Android рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП Retrofit 2 рдореЗрдВ рдПрдХ рдПрдбреЗрдкреНрдЯрд░ рд╣реИред
рдПрдбреЙрдкреНрдЯрд░ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ ред
рдереЛрдбрд╝рд╛ рд╕рд╛ рдХреЛрдб:
un createRetrofit(): Retrofit { val contentType = MediaType.get("application/json") return Retrofit.Builder() .addConverterFactory(serializationConverterFactory(contentType, JSON)) .baseUrl(BASE_URL) .client(provideOkhttpClient()) .build() }
рдпрджрд┐ рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдиреЛрдЯреЗрд╢рди рд╣реИрдВ, рддреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рдХреЛ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдХреНрд░рдордмрджреНрдзрддрд╛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЬреЛрдбрд╝ рд╣реИ рдФрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдпрд╛ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓, рдХрдо рд╢реНрд░рдо-рдЧрд╣рди рдмрдирд╛рддрд╛ рд╣реИред
рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рд╕реВрдЪреА
- KotlinxRetrofit Android рдкрд░ рдХреНрд░рдорд╛рдВрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдХрд╛рд░реНрдпрд╢реАрд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ
- kotlinx.serialization - рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рднрдВрдбрд╛рд░
JakeWharton / retrofit2-kotlinx-serialization- рдХрдирд╡рд░реНрдЯрд░ - рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ рдХреЗ рд▓рд┐рдП рдПрдбрд╛рдкреНрдЯрд░