Skip to content

Commit 886bb10

Browse files
committed
Also check collisions for JsonNamingStrategy-transformed names during serialization
1 parent ca11219 commit 886bb10

File tree

2 files changed

+12
-1
lines changed

2 files changed

+12
-1
lines changed

formats/json-tests/commonTest/src/kotlinx/serialization/features/JsonNamingStrategyTest.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,11 @@ class JsonNamingStrategyTest : JsonTestBase() {
182182
val json = Json(jsonWithNaming) {
183183
ignoreUnknownKeys = true
184184
}
185+
parametrizedTest { mode ->
186+
assertFailsWithMessage<SerializationException>("The transformed name 'test_case' for property test_case already exists") {
187+
json.encodeToString(CollisionCheckPrimary("a", "b"))
188+
}
189+
}
185190
parametrizedTest { mode ->
186191
assertFailsWithMessage<SerializationException>("The suggested name 'test_case' for property test_case is already one of the names for property testCase") {
187192
json.decodeFromString<CollisionCheckPrimary>("""{"test_case":"a"}""", mode)

formats/json/commonMain/src/kotlinx/serialization/json/internal/JsonNamesMap.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,15 @@ internal fun Json.deserializationNamesMap(descriptor: SerialDescriptor): Map<Str
5555

5656
internal fun SerialDescriptor.serializationNamesIndices(json: Json, strategy: JsonNamingStrategy): Array<String> =
5757
json.schemaCache.getOrPut(this, JsonSerializationNamesKey) {
58+
val trackingSet = mutableSetOf<String>()
5859
Array(elementsCount) { i ->
5960
val baseName = getElementName(i)
60-
strategy.serialNameForJson(this, i, baseName)
61+
val name = strategy.serialNameForJson(this, i, baseName)
62+
if (!trackingSet.add(name)) throw JsonEncodingException(
63+
"The transformed name '$name' for property $baseName already exists " +
64+
"in ${this@serializationNamesIndices}"
65+
)
66+
name
6167
}
6268
}
6369

0 commit comments

Comments
 (0)