提交 b592123b 编写于 作者: 悟空编码's avatar 悟空编码

init

上级
# Default ignored files
/shelf/
/workspace.xml
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4" />
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile default="true" name="Default" enabled="true">
<processorPath useClasspath="false" />
</profile>
</annotationProcessing>
<bytecodeTargetLevel target="1.8" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/kotlin/main.kt" charset="UTF-8" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="delegatedBuild" value="true" />
<option name="testRunner" value="GRADLE" />
<option name="distributionType" value="LOCAL" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleHome" value="$USER_HOME$/gradle-all-6.2" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="70a6173e-c6a3-455b-b77f-a0f4ff2ba1b6" />
<option name="name" value="70a6173e-c6a3-455b-b77f-a0f4ff2ba1b6" />
<option name="url" value="https://maven.aliyun.com/repository/central/" />
</remote-repository>
<remote-repository>
<option name="id" value="a14d4123-24ed-40ca-98fb-cdeb550780d6" />
<option name="name" value="a14d4123-24ed-40ca-98fb-cdeb550780d6" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="64f80f4e-75d8-4226-bf36-066f6a9c3a85" />
<option name="name" value="64f80f4e-75d8-4226-bf36-066f6a9c3a85" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="https://maven.aliyun.com/repository/gradle-plugin/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven4" />
<option name="name" value="maven4" />
<option name="url" value="https://maven.aliyun.com/repository/jcenter/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven3" />
<option name="name" value="maven3" />
<option name="url" value="https://maven.aliyun.com/repository/google/" />
</remote-repository>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Kotlin2JvmCompilerArguments">
<option name="jvmTarget" value="1.8" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="FrameworkDetectionExcludesConfiguration">
<file type="web" url="file://$PROJECT_DIR$" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm") version "1.4.0"
application
id("org.jetbrains.kotlin.plugin.serialization") version "1.4.10"
}
group = "org.xotty"
version = "1.0"
repositories {
maven { setUrl("https://maven.aliyun.com/repository/gradle-plugin/")}
maven { setUrl("https://maven.aliyun.com/repository/central/")}
maven { setUrl("https://maven.aliyun.com/repository/google/")}
maven { setUrl("https://maven.aliyun.com/repository/jcenter/")}
}
dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib:1.4.0")
testImplementation(kotlin("test-junit"))
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.0.0-RC")
}
tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "1.8"
}
application {
mainClassName = "MainKt"
}
\ No newline at end of file
kotlin.code.style=official
rootProject.name = "KotlinxSerialization"
/**Kotlinx序列化:自带Json解析
* 1。10种基本数据类型可直接处理,复合类型List、Set、Map也可以处理
* 2。@Serializable注解提供了序列化器,Json.encodeString/Json.decodeString提供了编解码
* 3。@serialName、@required、@transient三个注解用于修饰属性
* 4。json编解码特殊情况:null、属性缺省值、泛型、对象类型
*/
import kotlinx.serialization.*
import kotlinx.serialization.builtins.ListSerializer
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.Json
@Serializable
data class Project(val name: String, val language: String)
@Serializable
class Project0(val name: String, @SerialName("lang") val language: String)
//类的主构造器的所有参数必须是属性才可以序列化
//@Serializable 编译错误
class Project1(path: String) {
val owner: String = path.substringBefore('/')
val name: String = path.substringAfter('/')
}
@Serializable
class Project2 private constructor(val owner: String, val name: String) {
constructor(path: String) : this(
owner = path.substringBefore('/'),
name = path.substringAfter('/')
)
val path: String
get() = "$owner/$name"
}
@Serializable
class Project3(val name: String) {
init {
require(name.isNotEmpty()) { "name cannot be empty" }
}
}
@Serializable
data class Project4(val name: String, val language: String = "Kotlin")
@Serializable
data class Project5(val name: String, @Required val language: String = "Kotlin")
fun computeLanguage(): String {
println("Computing")
return "Kotlin"
}
@Serializable
data class Project6(val name: String, val language: String = computeLanguage())
@Serializable
data class Project7(val name: String, @Transient val language: String = "Kotlin")
@Serializable
class Project8(val name: String, val renamedTo: String? = null)
@Serializable
class Project9(val name: String, val owner: User)
@Serializable
class User(val name: String)
@Serializable
class Project10(val name: String, val owner: User, val maintainer: User)
@Serializable
class Box<T>(val contents: T)
@Serializable
class Data(
val a: Box<Int>,
val b: Box<Project>
)
//enum无须@Serializable注解,除非在其中使用了@SerialName
enum class Status { SUPPORTED }
@Serializable
class Project12(val name: String, val status: Status)
//Deserializing collections
@Serializable
data class DataX(
val a: List<Int>,
val b: Set<Int>
)
fun main() {
println("------------------------Json编解码-------------------------")
print("Project---encode:")
val data1 = Project("kotlinx.serialization", "Kotlin")
println(Json.encodeToString(data1)) //{"name":"kotlinx.serialization","language":"Kotlin"}
print("Project---decode:")
val data2 = Json.decodeFromString<Project>("""{"name":"kotlinx.serialization","language":"Kotlin"}""")
println(data2) //Project(name=kotlinx.serialization, language=Kotlin)
print("Project0(重命名属性):")
println(
Json.encodeToString(
Project0(
"kotlinx.serialization",
"Kotlin"
)
)
) //{"name":"kotlinx.serialization","lang":"Kotlin"}
print("Project2(主构造器属性):")
println(Json.encodeToString(Project2("kotlin/kotlinx.serialization"))) //{"owner":"kotlin","name":"kotlinx.serialization"}
print("Project3(初始化快):")
try {
println(Json.decodeFromString<Project3>("""{"name":""}"""))
} // //Exception in thread "main" java.lang.IllegalArgumentException: name cannot be empty
catch (e: Exception) {
println(e.message)
}
print("Project4(属性缺省值):")
//缺省编码
println(Json.encodeToString(Project4("kotlinx.serialization"))) //{"name":"kotlinx.serialization","language":"Kotlin"}
//缺省解码
println(Json.decodeFromString<Project4>("""{"name":"kotlinx.serialization"}""")) //Project(name=kotlinx.serialization, language=Kotlin)
//强制类型安全
try {
println(Json.decodeFromString<Project4>("""{"name":"kotlinx.serialization","language":null}""")) //Exception in thread "main" kotlinx.serializa....
} catch (e: Exception) {
println(e.message)
}
//必须序列化属性
print("Project5(Required Poperty):")
println(Json.encodeToString(Project5("kotlinx.serialization"))) //{"name":"kotlinx.serialization","language":"Kotlin"}
try {
println(Json.decodeFromString<Project>("""{"name":"kotlinx.serialization"}""")) ////Exception in thread "main" kotlinx.serialization.MissingFieldException: Field 'language' is required, but it was missing
} catch (e: Exception) {
println(e.message)
}
//计算属性
print("Project6:")
val data6 = Json.decodeFromString<Project6>(
"""
{"name":"kotlinx.serialization","language":"Kotlin"}
"""
)
println(data6) //Project(name=kotlinx.serialization, language=Kotlin)
//忽略序列化属性
print("Project7(Transient Property):")
try {
val data7 = Json.decodeFromString<Project7>(
"""
{"name":"kotlinx.serialization","language":"Kotlin"}
"""
)
println(data7) //Exception in thread "main" kotlinx.serialization.json.internal.Json.....
} catch (e: Exception) {
println(e.message)
}
//可空属性
print("Project8(Nullable Propery):")
val data8 = Project8("kotlinx.serialization")
println(Json.encodeToString(data8)) //{"name":"kotlinx.serialization","renamedTo":null}
//对象属性
print("Project9(Reference Property):")
val owner = User("kotlin")
val data9 = Project9("kotlinx.serialization", owner)
println(Json.encodeToString(data9)) //{"name":"kotlinx.serialization","owner":{"name":"kotlin"}}
print("Project10:")
val data10 = Project10("kotlinx.serialization", owner, owner)
println(Json.encodeToString(data10)) //{"name":"kotlinx.serialization","owner":{"name":"kotlin"},"maintainer":{"name":"kotlin"}}
//泛型类型序列化
print("Project11(Generic classes):")
val data11 = Data(Box(42), Box(Project("kotlinx.serialization", "Kotlin")))
println(Json.encodeToString(data11)) //{"a":{"contents":42},"b":{"contents":{"name":"kotlinx.serialization","language":"Kotlin"}}}
//Enum
print("Project12(Enum):")
val data12 = Project12("kotlinx.serialization", Status.SUPPORTED)
println(Json.encodeToString(data12)) //{"name":"kotlinx.serialization","status":"SUPPORTED"}
//Pair/Triple
print("Pair:")
val pair = 1 to Project3("kotlinx.serialization")
println(Json.encodeToString(pair)) //{"first":1,"second":{"name":"kotlinx.serialization"}}
//List
print("List:")
val list = listOf(
Project3("kotlinx.serialization"),
Project3("kotlinx.coroutines")
)
println(Json.encodeToString(list)) //[{"name":"kotlinx.serialization"},{"name":"kotlinx.coroutines"}]
//Set
print("Set:")
val set = setOf(
Project3("kotlinx.serialization"),
Project3("kotlinx.coroutines")
)
println(Json.encodeToString(set)) //[{"name":"kotlinx.serialization"},{"name":"kotlinx.coroutines"}]
//Map
print("Map:")
val map = mapOf(
1 to Project3("kotlinx.serialization"),
2 to Project3("kotlinx.coroutines")
)
println(Json.encodeToString(map)) //{"1":{"name":"kotlinx.serialization"},"2":{"name":"kotlinx.coroutines"}}
print("Deserializing collections:")
val datax = Json.decodeFromString<DataX>("""
{
"a": [42, 42],
"b": [42, 42]
}
""")
println(datax) //DataX(a=[42, 42], b=[42])
println("------------------------序列化器-------------------------")
//Plugin-generated serializer
val projectSerializer: KSerializer<Project> = Project.serializer()
println(projectSerializer.descriptor)
//generic serializer
val boxedDataSerializer = Box.serializer(Data.serializer())
println(boxedDataSerializer.descriptor)
//Builtin primitive serializers
val intSerializer: KSerializer<Int> = Int.serializer()
println(intSerializer.descriptor)
//Constructing collection serializers
val stringListSerializer: KSerializer<List<String>> = ListSerializer(String.serializer())
println(stringListSerializer.descriptor)
//Using top-level serializer function
val stringToColorMapSerializer: KSerializer<Map<String, Project>> = serializer()
println(stringToColorMapSerializer.descriptor)
val green = Color(0x00ff00)
println(Json.encodeToString(green)) //"00ff00"
val color = Json.decodeFromString<Color>("\"00ff00\"")
println(String.format("%06x",color.rgb))// ff00
val data = Settings(Color(0xffffff), Color(0))
val string = Json.encodeToString(data)
println(string)
}
object ColorAsStringSerializer : KSerializer<Color> {
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("Color", PrimitiveKind.STRING)
override fun serialize(encoder: Encoder, value: Color) {
val string = value.rgb.toString(16).padStart(6, '0')
encoder.encodeString(string)
}
override fun deserialize(decoder: Decoder): Color {
val string = decoder.decodeString()
return Color(string.toInt(16))
}
}
@Serializable(with = ColorAsStringSerializer::class)
class Color(val rgb: Int)
@Serializable
data class Settings(val background: Color, val foreground: Color)
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册