Skip to content

Commit cbd8ce3

Browse files
authored
Fix MissingFieldException duplication (#2213)
Fixes #2212
1 parent 2ca14df commit cbd8ce3

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package kotlinx.serialization.json
2+
3+
import kotlinx.serialization.*
4+
import kotlinx.serialization.json.Json.Default.decodeFromString
5+
import org.junit.*
6+
import org.junit.Test
7+
import java.io.ByteArrayInputStream
8+
import java.io.ByteArrayOutputStream
9+
import java.io.PrintWriter
10+
import java.io.StringWriter
11+
import kotlin.test.*
12+
13+
class MissingFieldExceptionWithPathTest {
14+
15+
@Test // Repro for #2212
16+
fun testMfeIsNotReappliedMultipleTimes() {
17+
val inputMalformed = """{"title": "...","cast": [{}]"""
18+
try {
19+
Json.decodeFromString<Movie>(inputMalformed)
20+
fail("Unreacheable state")
21+
} catch (e: MissingFieldException) {
22+
val fullStackTrace = e.stackTraceToString()
23+
val i1 = fullStackTrace.toString().indexOf("at path")
24+
val i2 = fullStackTrace.toString().lastIndexOf("at path")
25+
assertEquals(i1, i2)
26+
assertTrue(i1 != -1)
27+
}
28+
}
29+
30+
@Serializable
31+
data class Movie(
32+
val title: String,
33+
val cast: List<Cast>,
34+
)
35+
36+
@Serializable
37+
data class Cast(
38+
val name: String
39+
)
40+
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ internal open class StreamingJsonDecoder(
8787
return result
8888

8989
} catch (e: MissingFieldException) {
90+
// Add "at path" if and only if we've just caught an exception and it hasn't been augmented yet
91+
if (e.message!!.contains("at path")) throw e
92+
// NB: we could've use some additional flag marker or augment the stacktrace, but it seemed to be as too much of a burden
9093
throw MissingFieldException(e.missingFields, e.message + " at path: " + lexer.path.getPath(), e)
9194
}
9295
}

0 commit comments

Comments
 (0)