diff options
author | Leonid Startsev <sandwwraith@users.noreply.github.com> | 2021-08-17 22:47:24 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-17 22:47:24 +0300 |
commit | fa569a8f4f5475a18b546c09a27bdd959bd0099b (patch) | |
tree | d6d04008625d924113a62c0e10dfd731cbde864a /guide | |
parent | d00bff2bbda69a17083480ec9daaaad5a54d2b42 (diff) | |
download | kotlinx.serialization-fa569a8f4f5475a18b546c09a27bdd959bd0099b.tar.gz |
Documentation for 'explicitNulls' feature (#1634)
Fixes #1619
Co-authored-by: Sergey.Shanshin <sergey.shanshin@jetbrains.com>
Diffstat (limited to 'guide')
-rw-r--r-- | guide/example/example-json-07.kt | 25 | ||||
-rw-r--r-- | guide/example/example-json-08.kt | 19 | ||||
-rw-r--r-- | guide/example/example-json-09.kt | 16 | ||||
-rw-r--r-- | guide/example/example-json-10.kt | 19 | ||||
-rw-r--r-- | guide/example/example-json-11.kt | 10 | ||||
-rw-r--r-- | guide/example/example-json-12.kt | 23 | ||||
-rw-r--r-- | guide/example/example-json-13.kt | 18 | ||||
-rw-r--r-- | guide/example/example-json-14.kt | 31 | ||||
-rw-r--r-- | guide/example/example-json-15.kt | 16 | ||||
-rw-r--r-- | guide/example/example-json-16.kt | 32 | ||||
-rw-r--r-- | guide/example/example-json-17.kt | 36 | ||||
-rw-r--r-- | guide/example/example-json-18.kt | 61 | ||||
-rw-r--r-- | guide/example/example-json-19.kt | 58 | ||||
-rw-r--r-- | guide/example/example-json-20.kt | 37 | ||||
-rw-r--r-- | guide/test/JsonTest.kt | 40 |
15 files changed, 236 insertions, 205 deletions
diff --git a/guide/example/example-json-07.kt b/guide/example/example-json-07.kt index 94e6016f..60aa2b28 100644 --- a/guide/example/example-json-07.kt +++ b/guide/example/example-json-07.kt @@ -4,15 +4,20 @@ package example.exampleJson07 import kotlinx.serialization.* import kotlinx.serialization.json.* -val format = Json { allowStructuredMapKeys = true } +val format = Json { explicitNulls = false } -@Serializable -data class Project(val name: String) - -fun main() { - val map = mapOf( - Project("kotlinx.serialization") to "Serialization", - Project("kotlinx.coroutines") to "Coroutines" - ) - println(format.encodeToString(map)) +@Serializable +data class Project( + val name: String, + val language: String, + val version: String? = "1.2.2", + val website: String?, + val description: String? = null +) + +fun main() { + val data = Project("kotlinx.serialization", "Kotlin", null, null, null) + val json = format.encodeToString(data) + println(json) + println(format.decodeFromString<Project>(json)) } diff --git a/guide/example/example-json-08.kt b/guide/example/example-json-08.kt index a20dc4b3..046ff507 100644 --- a/guide/example/example-json-08.kt +++ b/guide/example/example-json-08.kt @@ -4,14 +4,15 @@ package example.exampleJson08 import kotlinx.serialization.* import kotlinx.serialization.json.* -val format = Json { allowSpecialFloatingPointValues = true } +val format = Json { allowStructuredMapKeys = true } -@Serializable -class Data( - val value: Double -) - -fun main() { - val data = Data(Double.NaN) - println(format.encodeToString(data)) +@Serializable +data class Project(val name: String) + +fun main() { + val map = mapOf( + Project("kotlinx.serialization") to "Serialization", + Project("kotlinx.coroutines") to "Coroutines" + ) + println(format.encodeToString(map)) } diff --git a/guide/example/example-json-09.kt b/guide/example/example-json-09.kt index fe90e8a6..00807fc9 100644 --- a/guide/example/example-json-09.kt +++ b/guide/example/example-json-09.kt @@ -4,18 +4,14 @@ package example.exampleJson09 import kotlinx.serialization.* import kotlinx.serialization.json.* -val format = Json { classDiscriminator = "#class" } +val format = Json { allowSpecialFloatingPointValues = true } @Serializable -sealed class Project { - abstract val name: String -} - -@Serializable -@SerialName("owned") -class OwnedProject(override val name: String, val owner: String) : Project() +class Data( + val value: Double +) fun main() { - val data: Project = OwnedProject("kotlinx.coroutines", "kotlin") + val data = Data(Double.NaN) println(format.encodeToString(data)) -} +} diff --git a/guide/example/example-json-10.kt b/guide/example/example-json-10.kt index 6a1b5d9b..a368101e 100644 --- a/guide/example/example-json-10.kt +++ b/guide/example/example-json-10.kt @@ -4,9 +4,18 @@ package example.exampleJson10 import kotlinx.serialization.* import kotlinx.serialization.json.* -fun main() { - val element = Json.parseToJsonElement(""" - {"name":"kotlinx.serialization","language":"Kotlin"} - """) - println(element) +val format = Json { classDiscriminator = "#class" } + +@Serializable +sealed class Project { + abstract val name: String } + +@Serializable +@SerialName("owned") +class OwnedProject(override val name: String, val owner: String) : Project() + +fun main() { + val data: Project = OwnedProject("kotlinx.coroutines", "kotlin") + println(format.encodeToString(data)) +} diff --git a/guide/example/example-json-11.kt b/guide/example/example-json-11.kt index 150cb009..e37c5db2 100644 --- a/guide/example/example-json-11.kt +++ b/guide/example/example-json-11.kt @@ -6,13 +6,7 @@ import kotlinx.serialization.json.* fun main() { val element = Json.parseToJsonElement(""" - { - "name": "kotlinx.serialization", - "forks": [{"votes": 42}, {"votes": 9000}, {}] - } + {"name":"kotlinx.serialization","language":"Kotlin"} """) - val sum = element - .jsonObject["forks"]!! - .jsonArray.sumOf { it.jsonObject["votes"]?.jsonPrimitive?.int ?: 0 } - println(sum) + println(element) } diff --git a/guide/example/example-json-12.kt b/guide/example/example-json-12.kt index 8923b683..925c3b50 100644 --- a/guide/example/example-json-12.kt +++ b/guide/example/example-json-12.kt @@ -5,19 +5,14 @@ import kotlinx.serialization.* import kotlinx.serialization.json.* fun main() { - val element = buildJsonObject { - put("name", "kotlinx.serialization") - putJsonObject("owner") { - put("name", "kotlin") + val element = Json.parseToJsonElement(""" + { + "name": "kotlinx.serialization", + "forks": [{"votes": 42}, {"votes": 9000}, {}] } - putJsonArray("forks") { - addJsonObject { - put("votes", 42) - } - addJsonObject { - put("votes", 9000) - } - } - } - println(element) + """) + val sum = element + .jsonObject["forks"]!! + .jsonArray.sumOf { it.jsonObject["votes"]?.jsonPrimitive?.int ?: 0 } + println(sum) } diff --git a/guide/example/example-json-13.kt b/guide/example/example-json-13.kt index 2e15c970..4115270e 100644 --- a/guide/example/example-json-13.kt +++ b/guide/example/example-json-13.kt @@ -4,14 +4,20 @@ package example.exampleJson13 import kotlinx.serialization.* import kotlinx.serialization.json.* -@Serializable -data class Project(val name: String, val language: String) - fun main() { val element = buildJsonObject { put("name", "kotlinx.serialization") - put("language", "Kotlin") + putJsonObject("owner") { + put("name", "kotlin") + } + putJsonArray("forks") { + addJsonObject { + put("votes", 42) + } + addJsonObject { + put("votes", 9000) + } + } } - val data = Json.decodeFromJsonElement<Project>(element) - println(data) + println(element) } diff --git a/guide/example/example-json-14.kt b/guide/example/example-json-14.kt index 98099912..3b2d58bf 100644 --- a/guide/example/example-json-14.kt +++ b/guide/example/example-json-14.kt @@ -4,29 +4,14 @@ package example.exampleJson14 import kotlinx.serialization.* import kotlinx.serialization.json.* -import kotlinx.serialization.builtins.* - @Serializable -data class Project( - val name: String, - @Serializable(with = UserListSerializer::class) - val users: List<User> -) - -@Serializable -data class User(val name: String) - -object UserListSerializer : JsonTransformingSerializer<List<User>>(ListSerializer(User.serializer())) { - // If response is not an array, then it is a single object that should be wrapped into the array - override fun transformDeserialize(element: JsonElement): JsonElement = - if (element !is JsonArray) JsonArray(listOf(element)) else element -} +data class Project(val name: String, val language: String) -fun main() { - println(Json.decodeFromString<Project>(""" - {"name":"kotlinx.serialization","users":{"name":"kotlin"}} - """)) - println(Json.decodeFromString<Project>(""" - {"name":"kotlinx.serialization","users":[{"name":"kotlin"},{"name":"jetbrains"}]} - """)) +fun main() { + val element = buildJsonObject { + put("name", "kotlinx.serialization") + put("language", "Kotlin") + } + val data = Json.decodeFromJsonElement<Project>(element) + println(data) } diff --git a/guide/example/example-json-15.kt b/guide/example/example-json-15.kt index 034cb85a..1fa9166d 100644 --- a/guide/example/example-json-15.kt +++ b/guide/example/example-json-15.kt @@ -17,14 +17,16 @@ data class Project( data class User(val name: String) object UserListSerializer : JsonTransformingSerializer<List<User>>(ListSerializer(User.serializer())) { - - override fun transformSerialize(element: JsonElement): JsonElement { - require(element is JsonArray) // we are using this serializer with lists only - return element.singleOrNull() ?: element - } + // If response is not an array, then it is a single object that should be wrapped into the array + override fun transformDeserialize(element: JsonElement): JsonElement = + if (element !is JsonArray) JsonArray(listOf(element)) else element } fun main() { - val data = Project("kotlinx.serialization", listOf(User("kotlin"))) - println(Json.encodeToString(data)) + println(Json.decodeFromString<Project>(""" + {"name":"kotlinx.serialization","users":{"name":"kotlin"}} + """)) + println(Json.decodeFromString<Project>(""" + {"name":"kotlinx.serialization","users":[{"name":"kotlin"},{"name":"jetbrains"}]} + """)) } diff --git a/guide/example/example-json-16.kt b/guide/example/example-json-16.kt index 1c84da4b..c8bf46d1 100644 --- a/guide/example/example-json-16.kt +++ b/guide/example/example-json-16.kt @@ -4,19 +4,27 @@ package example.exampleJson16 import kotlinx.serialization.* import kotlinx.serialization.json.* +import kotlinx.serialization.builtins.* + +@Serializable +data class Project( + val name: String, + @Serializable(with = UserListSerializer::class) + val users: List<User> +) + @Serializable -class Project(val name: String, val language: String) +data class User(val name: String) -object ProjectSerializer : JsonTransformingSerializer<Project>(Project.serializer()) { - override fun transformSerialize(element: JsonElement): JsonElement = - // Filter out top-level key value pair with the key "language" and the value "Kotlin" - JsonObject(element.jsonObject.filterNot { - (k, v) -> k == "language" && v.jsonPrimitive.content == "Kotlin" - }) -} +object UserListSerializer : JsonTransformingSerializer<List<User>>(ListSerializer(User.serializer())) { + + override fun transformSerialize(element: JsonElement): JsonElement { + require(element is JsonArray) // we are using this serializer with lists only + return element.singleOrNull() ?: element + } +} -fun main() { - val data = Project("kotlinx.serialization", "Kotlin") - println(Json.encodeToString(data)) // using plugin-generated serializer - println(Json.encodeToString(ProjectSerializer, data)) // using custom serializer +fun main() { + val data = Project("kotlinx.serialization", listOf(User("kotlin"))) + println(Json.encodeToString(data)) } diff --git a/guide/example/example-json-17.kt b/guide/example/example-json-17.kt index c217a12d..f69faa64 100644 --- a/guide/example/example-json-17.kt +++ b/guide/example/example-json-17.kt @@ -4,33 +4,19 @@ package example.exampleJson17 import kotlinx.serialization.* import kotlinx.serialization.json.* -import kotlinx.serialization.builtins.* - @Serializable -abstract class Project { - abstract val name: String -} - -@Serializable -data class BasicProject(override val name: String): Project() +class Project(val name: String, val language: String) - -@Serializable -data class OwnedProject(override val name: String, val owner: String) : Project() - -object ProjectSerializer : JsonContentPolymorphicSerializer<Project>(Project::class) { - override fun selectDeserializer(element: JsonElement) = when { - "owner" in element.jsonObject -> OwnedProject.serializer() - else -> BasicProject.serializer() - } -} +object ProjectSerializer : JsonTransformingSerializer<Project>(Project.serializer()) { + override fun transformSerialize(element: JsonElement): JsonElement = + // Filter out top-level key value pair with the key "language" and the value "Kotlin" + JsonObject(element.jsonObject.filterNot { + (k, v) -> k == "language" && v.jsonPrimitive.content == "Kotlin" + }) +} fun main() { - val data = listOf( - OwnedProject("kotlinx.serialization", "kotlin"), - BasicProject("example") - ) - val string = Json.encodeToString(ListSerializer(ProjectSerializer), data) - println(string) - println(Json.decodeFromString(ListSerializer(ProjectSerializer), string)) + val data = Project("kotlinx.serialization", "Kotlin") + println(Json.encodeToString(data)) // using plugin-generated serializer + println(Json.encodeToString(ProjectSerializer, data)) // using custom serializer } diff --git a/guide/example/example-json-18.kt b/guide/example/example-json-18.kt index 22e082ac..a646494f 100644 --- a/guide/example/example-json-18.kt +++ b/guide/example/example-json-18.kt @@ -4,56 +4,33 @@ package example.exampleJson18 import kotlinx.serialization.* import kotlinx.serialization.json.* -import kotlinx.serialization.descriptors.* -import kotlinx.serialization.encoding.* +import kotlinx.serialization.builtins.* -@Serializable(with = ResponseSerializer::class) -sealed class Response<out T> { - data class Ok<out T>(val data: T) : Response<T>() - data class Error(val message: String) : Response<Nothing>() -} +@Serializable +abstract class Project { + abstract val name: String +} -class ResponseSerializer<T>(private val dataSerializer: KSerializer<T>) : KSerializer<Response<T>> { - override val descriptor: SerialDescriptor = buildSerialDescriptor("Response", PolymorphicKind.SEALED) { - element("Ok", buildClassSerialDescriptor("Ok") { - element<String>("message") - }) - element("Error", dataSerializer.descriptor) - } +@Serializable +data class BasicProject(override val name: String): Project() - override fun deserialize(decoder: Decoder): Response<T> { - // Decoder -> JsonDecoder - require(decoder is JsonDecoder) // this class can be decoded only by Json - // JsonDecoder -> JsonElement - val element = decoder.decodeJsonElement() - // JsonElement -> value - if (element is JsonObject && "error" in element) - return Response.Error(element["error"]!!.jsonPrimitive.content) - return Response.Ok(decoder.json.decodeFromJsonElement(dataSerializer, element)) - } + +@Serializable +data class OwnedProject(override val name: String, val owner: String) : Project() - override fun serialize(encoder: Encoder, value: Response<T>) { - // Encoder -> JsonEncoder - require(encoder is JsonEncoder) // This class can be encoded only by Json - // value -> JsonElement - val element = when (value) { - is Response.Ok -> encoder.json.encodeToJsonElement(dataSerializer, value.data) - is Response.Error -> buildJsonObject { put("error", value.message) } - } - // JsonElement -> JsonEncoder - encoder.encodeJsonElement(element) +object ProjectSerializer : JsonContentPolymorphicSerializer<Project>(Project::class) { + override fun selectDeserializer(element: JsonElement) = when { + "owner" in element.jsonObject -> OwnedProject.serializer() + else -> BasicProject.serializer() } } -@Serializable -data class Project(val name: String) - fun main() { - val responses = listOf( - Response.Ok(Project("kotlinx.serialization")), - Response.Error("Not found") + val data = listOf( + OwnedProject("kotlinx.serialization", "kotlin"), + BasicProject("example") ) - val string = Json.encodeToString(responses) + val string = Json.encodeToString(ListSerializer(ProjectSerializer), data) println(string) - println(Json.decodeFromString<List<Response<Project>>>(string)) + println(Json.decodeFromString(ListSerializer(ProjectSerializer), string)) } diff --git a/guide/example/example-json-19.kt b/guide/example/example-json-19.kt index e0d99c8f..469cdd67 100644 --- a/guide/example/example-json-19.kt +++ b/guide/example/example-json-19.kt @@ -7,31 +7,53 @@ import kotlinx.serialization.json.* import kotlinx.serialization.descriptors.* import kotlinx.serialization.encoding.* -data class UnknownProject(val name: String, val details: JsonObject) +@Serializable(with = ResponseSerializer::class) +sealed class Response<out T> { + data class Ok<out T>(val data: T) : Response<T>() + data class Error(val message: String) : Response<Nothing>() +} -object UnknownProjectSerializer : KSerializer<UnknownProject> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("UnknownProject") { - element<String>("name") - element<JsonElement>("details") +class ResponseSerializer<T>(private val dataSerializer: KSerializer<T>) : KSerializer<Response<T>> { + override val descriptor: SerialDescriptor = buildSerialDescriptor("Response", PolymorphicKind.SEALED) { + element("Ok", buildClassSerialDescriptor("Ok") { + element<String>("message") + }) + element("Error", dataSerializer.descriptor) } - override fun deserialize(decoder: Decoder): UnknownProject { - // Cast to JSON-specific interface - val jsonInput = decoder as? JsonDecoder ?: error("Can be deserialized only by JSON") - // Read the whole content as JSON - val json = jsonInput.decodeJsonElement().jsonObject - // Extract and remove name property - val name = json.getValue("name").jsonPrimitive.content - val details = json.toMutableMap() - details.remove("name") - return UnknownProject(name, JsonObject(details)) + override fun deserialize(decoder: Decoder): Response<T> { + // Decoder -> JsonDecoder + require(decoder is JsonDecoder) // this class can be decoded only by Json + // JsonDecoder -> JsonElement + val element = decoder.decodeJsonElement() + // JsonElement -> value + if (element is JsonObject && "error" in element) + return Response.Error(element["error"]!!.jsonPrimitive.content) + return Response.Ok(decoder.json.decodeFromJsonElement(dataSerializer, element)) } - override fun serialize(encoder: Encoder, value: UnknownProject) { - error("Serialization is not supported") + override fun serialize(encoder: Encoder, value: Response<T>) { + // Encoder -> JsonEncoder + require(encoder is JsonEncoder) // This class can be encoded only by Json + // value -> JsonElement + val element = when (value) { + is Response.Ok -> encoder.json.encodeToJsonElement(dataSerializer, value.data) + is Response.Error -> buildJsonObject { put("error", value.message) } + } + // JsonElement -> JsonEncoder + encoder.encodeJsonElement(element) } } +@Serializable +data class Project(val name: String) + fun main() { - println(Json.decodeFromString(UnknownProjectSerializer, """{"type":"unknown","name":"example","maintainer":"Unknown","license":"Apache 2.0"}""")) + val responses = listOf( + Response.Ok(Project("kotlinx.serialization")), + Response.Error("Not found") + ) + val string = Json.encodeToString(responses) + println(string) + println(Json.decodeFromString<List<Response<Project>>>(string)) } diff --git a/guide/example/example-json-20.kt b/guide/example/example-json-20.kt new file mode 100644 index 00000000..d12547d7 --- /dev/null +++ b/guide/example/example-json-20.kt @@ -0,0 +1,37 @@ +// This file was automatically generated from json.md by Knit tool. Do not edit. +package example.exampleJson20 + +import kotlinx.serialization.* +import kotlinx.serialization.json.* + +import kotlinx.serialization.descriptors.* +import kotlinx.serialization.encoding.* + +data class UnknownProject(val name: String, val details: JsonObject) + +object UnknownProjectSerializer : KSerializer<UnknownProject> { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("UnknownProject") { + element<String>("name") + element<JsonElement>("details") + } + + override fun deserialize(decoder: Decoder): UnknownProject { + // Cast to JSON-specific interface + val jsonInput = decoder as? JsonDecoder ?: error("Can be deserialized only by JSON") + // Read the whole content as JSON + val json = jsonInput.decodeJsonElement().jsonObject + // Extract and remove name property + val name = json.getValue("name").jsonPrimitive.content + val details = json.toMutableMap() + details.remove("name") + return UnknownProject(name, JsonObject(details)) + } + + override fun serialize(encoder: Encoder, value: UnknownProject) { + error("Serialization is not supported") + } +} + +fun main() { + println(Json.decodeFromString(UnknownProjectSerializer, """{"type":"unknown","name":"example","maintainer":"Unknown","license":"Apache 2.0"}""")) +} diff --git a/guide/test/JsonTest.kt b/guide/test/JsonTest.kt index 7e26b8f0..3dee6e2b 100644 --- a/guide/test/JsonTest.kt +++ b/guide/test/JsonTest.kt @@ -54,94 +54,102 @@ class JsonTest { @Test fun testExampleJson07() { captureOutput("ExampleJson07") { example.exampleJson07.main() }.verifyOutputLines( - "[{\"name\":\"kotlinx.serialization\"},\"Serialization\",{\"name\":\"kotlinx.coroutines\"},\"Coroutines\"]" + "{\"name\":\"kotlinx.serialization\",\"language\":\"Kotlin\"}", + "Project(name=kotlinx.serialization, language=Kotlin, version=1.2.2, website=null, description=null)" ) } @Test fun testExampleJson08() { captureOutput("ExampleJson08") { example.exampleJson08.main() }.verifyOutputLines( - "{\"value\":NaN}" + "[{\"name\":\"kotlinx.serialization\"},\"Serialization\",{\"name\":\"kotlinx.coroutines\"},\"Coroutines\"]" ) } @Test fun testExampleJson09() { captureOutput("ExampleJson09") { example.exampleJson09.main() }.verifyOutputLines( - "{\"#class\":\"owned\",\"name\":\"kotlinx.coroutines\",\"owner\":\"kotlin\"}" + "{\"value\":NaN}" ) } @Test fun testExampleJson10() { captureOutput("ExampleJson10") { example.exampleJson10.main() }.verifyOutputLines( - "{\"name\":\"kotlinx.serialization\",\"language\":\"Kotlin\"}" + "{\"#class\":\"owned\",\"name\":\"kotlinx.coroutines\",\"owner\":\"kotlin\"}" ) } @Test fun testExampleJson11() { captureOutput("ExampleJson11") { example.exampleJson11.main() }.verifyOutputLines( - "9042" + "{\"name\":\"kotlinx.serialization\",\"language\":\"Kotlin\"}" ) } @Test fun testExampleJson12() { captureOutput("ExampleJson12") { example.exampleJson12.main() }.verifyOutputLines( - "{\"name\":\"kotlinx.serialization\",\"owner\":{\"name\":\"kotlin\"},\"forks\":[{\"votes\":42},{\"votes\":9000}]}" + "9042" ) } @Test fun testExampleJson13() { captureOutput("ExampleJson13") { example.exampleJson13.main() }.verifyOutputLines( - "Project(name=kotlinx.serialization, language=Kotlin)" + "{\"name\":\"kotlinx.serialization\",\"owner\":{\"name\":\"kotlin\"},\"forks\":[{\"votes\":42},{\"votes\":9000}]}" ) } @Test fun testExampleJson14() { captureOutput("ExampleJson14") { example.exampleJson14.main() }.verifyOutputLines( - "Project(name=kotlinx.serialization, users=[User(name=kotlin)])", - "Project(name=kotlinx.serialization, users=[User(name=kotlin), User(name=jetbrains)])" + "Project(name=kotlinx.serialization, language=Kotlin)" ) } @Test fun testExampleJson15() { captureOutput("ExampleJson15") { example.exampleJson15.main() }.verifyOutputLines( - "{\"name\":\"kotlinx.serialization\",\"users\":{\"name\":\"kotlin\"}}" + "Project(name=kotlinx.serialization, users=[User(name=kotlin)])", + "Project(name=kotlinx.serialization, users=[User(name=kotlin), User(name=jetbrains)])" ) } @Test fun testExampleJson16() { captureOutput("ExampleJson16") { example.exampleJson16.main() }.verifyOutputLines( - "{\"name\":\"kotlinx.serialization\",\"language\":\"Kotlin\"}", - "{\"name\":\"kotlinx.serialization\"}" + "{\"name\":\"kotlinx.serialization\",\"users\":{\"name\":\"kotlin\"}}" ) } @Test fun testExampleJson17() { captureOutput("ExampleJson17") { example.exampleJson17.main() }.verifyOutputLines( - "[{\"name\":\"kotlinx.serialization\",\"owner\":\"kotlin\"},{\"name\":\"example\"}]", - "[OwnedProject(name=kotlinx.serialization, owner=kotlin), BasicProject(name=example)]" + "{\"name\":\"kotlinx.serialization\",\"language\":\"Kotlin\"}", + "{\"name\":\"kotlinx.serialization\"}" ) } @Test fun testExampleJson18() { captureOutput("ExampleJson18") { example.exampleJson18.main() }.verifyOutputLines( - "[{\"name\":\"kotlinx.serialization\"},{\"error\":\"Not found\"}]", - "[Ok(data=Project(name=kotlinx.serialization)), Error(message=Not found)]" + "[{\"name\":\"kotlinx.serialization\",\"owner\":\"kotlin\"},{\"name\":\"example\"}]", + "[OwnedProject(name=kotlinx.serialization, owner=kotlin), BasicProject(name=example)]" ) } @Test fun testExampleJson19() { captureOutput("ExampleJson19") { example.exampleJson19.main() }.verifyOutputLines( + "[{\"name\":\"kotlinx.serialization\"},{\"error\":\"Not found\"}]", + "[Ok(data=Project(name=kotlinx.serialization)), Error(message=Not found)]" + ) + } + + @Test + fun testExampleJson20() { + captureOutput("ExampleJson20") { example.exampleJson20.main() }.verifyOutputLines( "UnknownProject(name=example, details={\"type\":\"unknown\",\"maintainer\":\"Unknown\",\"license\":\"Apache 2.0\"})" ) } |