Skip to content

Commit 9157bf8

Browse files
authored
Implement addAll functions for JsonArrayBuilder (#2156)
Fixes #2127
1 parent ef67bce commit 9157bf8

File tree

3 files changed

+144
-0
lines changed

3 files changed

+144
-0
lines changed

formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonBuildersTest.kt

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,105 @@ class JsonBuildersTest {
4343
}
4444
assertEquals("""[true,[1,2,3,4,5,6,7,8,9,10],null,{"stringKey":"stringValue"}]""", json.toString())
4545
}
46+
47+
@Test
48+
fun testBuildJsonArrayAddAll() {
49+
assertEquals(
50+
"""[1,2,3,4,5,null]""",
51+
buildJsonArray {
52+
assertTrue { addAll(listOf(1, 2, 3, 4, 5, null)) }
53+
}.toString()
54+
)
55+
56+
assertEquals(
57+
"""["a","b","c",null]""",
58+
buildJsonArray {
59+
assertTrue { addAll(listOf("a", "b", "c", null)) }
60+
}.toString()
61+
)
62+
63+
assertEquals(
64+
"""[true,false,null]""",
65+
buildJsonArray {
66+
assertTrue { addAll(listOf(true, false, null)) }
67+
}.toString()
68+
)
69+
70+
assertEquals(
71+
"""[2,"b",true,null]""",
72+
buildJsonArray {
73+
assertTrue {
74+
addAll(
75+
listOf(
76+
JsonPrimitive(2),
77+
JsonPrimitive("b"),
78+
JsonPrimitive(true),
79+
JsonNull,
80+
)
81+
)
82+
}
83+
}.toString()
84+
)
85+
86+
assertEquals(
87+
"""[{},{},{},null]""",
88+
buildJsonArray {
89+
assertTrue {
90+
addAll(
91+
listOf(
92+
JsonObject(emptyMap()),
93+
JsonObject(emptyMap()),
94+
JsonObject(emptyMap()),
95+
JsonNull
96+
)
97+
)
98+
}
99+
}.toString()
100+
)
101+
102+
assertEquals(
103+
"""[[],[],[],null]""",
104+
buildJsonArray {
105+
assertTrue {
106+
addAll(
107+
listOf(
108+
JsonArray(emptyList()),
109+
JsonArray(emptyList()),
110+
JsonArray(emptyList()),
111+
JsonNull
112+
)
113+
)
114+
}
115+
}.toString()
116+
)
117+
118+
assertEquals(
119+
"""[null,null]""",
120+
buildJsonArray {
121+
assertTrue {
122+
addAll(listOf(JsonNull, JsonNull))
123+
}
124+
}.toString()
125+
)
126+
}
127+
128+
@Test
129+
fun testBuildJsonArrayAddAllNotModified() {
130+
assertEquals(
131+
"""[]""",
132+
buildJsonArray {
133+
// add collections
134+
assertFalse { addAll(listOf<Number>()) }
135+
assertFalse { addAll(listOf<String>()) }
136+
assertFalse { addAll(listOf<Boolean>()) }
137+
138+
// add json elements
139+
assertFalse { addAll(listOf()) }
140+
assertFalse { addAll(listOf<JsonNull>()) }
141+
assertFalse { addAll(listOf<JsonObject>()) }
142+
assertFalse { addAll(listOf<JsonArray>()) }
143+
assertFalse { addAll(listOf<JsonPrimitive>()) }
144+
}.toString()
145+
)
146+
}
46147
}

formats/json/api/kotlinx-serialization-json.api

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ public final class kotlinx/serialization/json/JsonArray$Companion {
7070
public final class kotlinx/serialization/json/JsonArrayBuilder {
7171
public fun <init> ()V
7272
public final fun add (Lkotlinx/serialization/json/JsonElement;)Z
73+
public final fun addAll (Ljava/util/Collection;)Z
7374
public final fun build ()Lkotlinx/serialization/json/JsonArray;
7475
}
7576

@@ -173,6 +174,9 @@ public final class kotlinx/serialization/json/JsonElementBuildersKt {
173174
public static final fun add (Lkotlinx/serialization/json/JsonArrayBuilder;Ljava/lang/Number;)Z
174175
public static final fun add (Lkotlinx/serialization/json/JsonArrayBuilder;Ljava/lang/String;)Z
175176
public static final fun add (Lkotlinx/serialization/json/JsonArrayBuilder;Ljava/lang/Void;)Z
177+
public static final fun addAllBooleans (Lkotlinx/serialization/json/JsonArrayBuilder;Ljava/util/Collection;)Z
178+
public static final fun addAllNumbers (Lkotlinx/serialization/json/JsonArrayBuilder;Ljava/util/Collection;)Z
179+
public static final fun addAllStrings (Lkotlinx/serialization/json/JsonArrayBuilder;Ljava/util/Collection;)Z
176180
public static final fun addJsonArray (Lkotlinx/serialization/json/JsonArrayBuilder;Lkotlin/jvm/functions/Function1;)Z
177181
public static final fun addJsonObject (Lkotlinx/serialization/json/JsonArrayBuilder;Lkotlin/jvm/functions/Function1;)Z
178182
public static final fun buildJsonArray (Lkotlin/jvm/functions/Function1;)Lkotlinx/serialization/json/JsonArray;

formats/json/commonMain/src/kotlinx/serialization/json/JsonElementBuilders.kt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package kotlinx.serialization.json
77

88
import kotlinx.serialization.ExperimentalSerializationApi
99
import kotlin.contracts.*
10+
import kotlin.jvm.JvmName
1011

1112
/**
1213
* Builds [JsonObject] with the given [builderAction] builder.
@@ -136,6 +137,15 @@ public class JsonArrayBuilder @PublishedApi internal constructor() {
136137
return true
137138
}
138139

140+
/**
141+
* Adds the given JSON [elements] to a resulting JSON array.
142+
*
143+
* @return `true` if the list was changed as the result of the operation.
144+
*/
145+
@ExperimentalSerializationApi
146+
public fun addAll(elements: Collection<JsonElement>): Boolean =
147+
content.addAll(elements)
148+
139149
@PublishedApi
140150
internal fun build(): JsonArray = JsonArray(content)
141151
}
@@ -186,6 +196,35 @@ public fun JsonArrayBuilder.addJsonObject(builderAction: JsonObjectBuilder.() ->
186196
public fun JsonArrayBuilder.addJsonArray(builderAction: JsonArrayBuilder.() -> Unit): Boolean =
187197
add(buildJsonArray(builderAction))
188198

199+
/**
200+
* Adds the given string [values] to a resulting JSON array.
201+
*
202+
* @return `true` if the list was changed as the result of the operation.
203+
*/
204+
@JvmName("addAllStrings")
205+
@ExperimentalSerializationApi
206+
public fun JsonArrayBuilder.addAll(values: Collection<String?>): Boolean =
207+
addAll(values.map(::JsonPrimitive))
208+
209+
/**
210+
* Adds the given boolean [values] to a resulting JSON array.
211+
*
212+
* @return `true` if the list was changed as the result of the operation.
213+
*/
214+
@JvmName("addAllBooleans")
215+
@ExperimentalSerializationApi
216+
public fun JsonArrayBuilder.addAll(values: Collection<Boolean?>): Boolean =
217+
addAll(values.map(::JsonPrimitive))
218+
219+
/**
220+
* Adds the given numeric [values] to a resulting JSON array.
221+
*
222+
* @return `true` if the list was changed as the result of the operation.
223+
*/
224+
@JvmName("addAllNumbers")
225+
@ExperimentalSerializationApi
226+
public fun JsonArrayBuilder.addAll(values: Collection<Number?>): Boolean =
227+
addAll(values.map(::JsonPrimitive))
189228

190229
@DslMarker
191230
internal annotation class JsonDslMarker

0 commit comments

Comments
 (0)