diff --git a/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonBuildersTest.kt b/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonBuildersTest.kt index 9e4e57223e..c2dab08941 100644 --- a/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonBuildersTest.kt +++ b/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonBuildersTest.kt @@ -43,4 +43,105 @@ class JsonBuildersTest { } assertEquals("""[true,[1,2,3,4,5,6,7,8,9,10],null,{"stringKey":"stringValue"}]""", json.toString()) } + + @Test + fun testBuildJsonArrayAddAll() { + assertEquals( + """[1,2,3,4,5,null]""", + buildJsonArray { + assertTrue { addAll(listOf(1, 2, 3, 4, 5, null)) } + }.toString() + ) + + assertEquals( + """["a","b","c",null]""", + buildJsonArray { + assertTrue { addAll(listOf("a", "b", "c", null)) } + }.toString() + ) + + assertEquals( + """[true,false,null]""", + buildJsonArray { + assertTrue { addAll(listOf(true, false, null)) } + }.toString() + ) + + assertEquals( + """[2,"b",true,null]""", + buildJsonArray { + assertTrue { + addAll( + listOf( + JsonPrimitive(2), + JsonPrimitive("b"), + JsonPrimitive(true), + JsonNull, + ) + ) + } + }.toString() + ) + + assertEquals( + """[{},{},{},null]""", + buildJsonArray { + assertTrue { + addAll( + listOf( + JsonObject(emptyMap()), + JsonObject(emptyMap()), + JsonObject(emptyMap()), + JsonNull + ) + ) + } + }.toString() + ) + + assertEquals( + """[[],[],[],null]""", + buildJsonArray { + assertTrue { + addAll( + listOf( + JsonArray(emptyList()), + JsonArray(emptyList()), + JsonArray(emptyList()), + JsonNull + ) + ) + } + }.toString() + ) + + assertEquals( + """[null,null]""", + buildJsonArray { + assertTrue { + addAll(listOf(JsonNull, JsonNull)) + } + }.toString() + ) + } + + @Test + fun testBuildJsonArrayAddAllNotModified() { + assertEquals( + """[]""", + buildJsonArray { + // add collections + assertFalse { addAll(listOf()) } + assertFalse { addAll(listOf()) } + assertFalse { addAll(listOf()) } + + // add json elements + assertFalse { addAll(listOf()) } + assertFalse { addAll(listOf()) } + assertFalse { addAll(listOf()) } + assertFalse { addAll(listOf()) } + assertFalse { addAll(listOf()) } + }.toString() + ) + } } diff --git a/formats/json/api/kotlinx-serialization-json.api b/formats/json/api/kotlinx-serialization-json.api index 898a94a0fa..fec5e1b59d 100644 --- a/formats/json/api/kotlinx-serialization-json.api +++ b/formats/json/api/kotlinx-serialization-json.api @@ -70,6 +70,7 @@ public final class kotlinx/serialization/json/JsonArray$Companion { public final class kotlinx/serialization/json/JsonArrayBuilder { public fun ()V public final fun add (Lkotlinx/serialization/json/JsonElement;)Z + public final fun addAll (Ljava/util/Collection;)Z public final fun build ()Lkotlinx/serialization/json/JsonArray; } @@ -173,6 +174,9 @@ public final class kotlinx/serialization/json/JsonElementBuildersKt { public static final fun add (Lkotlinx/serialization/json/JsonArrayBuilder;Ljava/lang/Number;)Z public static final fun add (Lkotlinx/serialization/json/JsonArrayBuilder;Ljava/lang/String;)Z public static final fun add (Lkotlinx/serialization/json/JsonArrayBuilder;Ljava/lang/Void;)Z + public static final fun addAllBooleans (Lkotlinx/serialization/json/JsonArrayBuilder;Ljava/util/Collection;)Z + public static final fun addAllNumbers (Lkotlinx/serialization/json/JsonArrayBuilder;Ljava/util/Collection;)Z + public static final fun addAllStrings (Lkotlinx/serialization/json/JsonArrayBuilder;Ljava/util/Collection;)Z public static final fun addJsonArray (Lkotlinx/serialization/json/JsonArrayBuilder;Lkotlin/jvm/functions/Function1;)Z public static final fun addJsonObject (Lkotlinx/serialization/json/JsonArrayBuilder;Lkotlin/jvm/functions/Function1;)Z public static final fun buildJsonArray (Lkotlin/jvm/functions/Function1;)Lkotlinx/serialization/json/JsonArray; diff --git a/formats/json/commonMain/src/kotlinx/serialization/json/JsonElementBuilders.kt b/formats/json/commonMain/src/kotlinx/serialization/json/JsonElementBuilders.kt index b49a1aaaba..7a25efdf4b 100644 --- a/formats/json/commonMain/src/kotlinx/serialization/json/JsonElementBuilders.kt +++ b/formats/json/commonMain/src/kotlinx/serialization/json/JsonElementBuilders.kt @@ -7,6 +7,7 @@ package kotlinx.serialization.json import kotlinx.serialization.ExperimentalSerializationApi import kotlin.contracts.* +import kotlin.jvm.JvmName /** * Builds [JsonObject] with the given [builderAction] builder. @@ -136,6 +137,15 @@ public class JsonArrayBuilder @PublishedApi internal constructor() { return true } + /** + * Adds the given JSON [elements] to a resulting JSON array. + * + * @return `true` if the list was changed as the result of the operation. + */ + @ExperimentalSerializationApi + public fun addAll(elements: Collection): Boolean = + content.addAll(elements) + @PublishedApi internal fun build(): JsonArray = JsonArray(content) } @@ -186,6 +196,35 @@ public fun JsonArrayBuilder.addJsonObject(builderAction: JsonObjectBuilder.() -> public fun JsonArrayBuilder.addJsonArray(builderAction: JsonArrayBuilder.() -> Unit): Boolean = add(buildJsonArray(builderAction)) +/** + * Adds the given string [values] to a resulting JSON array. + * + * @return `true` if the list was changed as the result of the operation. + */ +@JvmName("addAllStrings") +@ExperimentalSerializationApi +public fun JsonArrayBuilder.addAll(values: Collection): Boolean = + addAll(values.map(::JsonPrimitive)) + +/** + * Adds the given boolean [values] to a resulting JSON array. + * + * @return `true` if the list was changed as the result of the operation. + */ +@JvmName("addAllBooleans") +@ExperimentalSerializationApi +public fun JsonArrayBuilder.addAll(values: Collection): Boolean = + addAll(values.map(::JsonPrimitive)) + +/** + * Adds the given numeric [values] to a resulting JSON array. + * + * @return `true` if the list was changed as the result of the operation. + */ +@JvmName("addAllNumbers") +@ExperimentalSerializationApi +public fun JsonArrayBuilder.addAll(values: Collection): Boolean = + addAll(values.map(::JsonPrimitive)) @DslMarker internal annotation class JsonDslMarker