Skip to content

Commit 78441dd

Browse files
committed
Add float support in JSON de/serialization
1 parent 83ba578 commit 78441dd

File tree

2 files changed

+11
-9
lines changed
  • core/src
    • main/kotlin/org/jetbrains/kotlinx/dataframe/io
    • test/kotlin/org/jetbrains/kotlinx/dataframe/io

2 files changed

+11
-9
lines changed

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/json.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import kotlinx.serialization.json.buildJsonObject
1616
import kotlinx.serialization.json.decodeFromStream
1717
import kotlinx.serialization.json.double
1818
import kotlinx.serialization.json.doubleOrNull
19+
import kotlinx.serialization.json.float
20+
import kotlinx.serialization.json.floatOrNull
1921
import kotlinx.serialization.json.int
2022
import kotlinx.serialization.json.intOrNull
2123
import kotlinx.serialization.json.jsonArray
@@ -465,7 +467,7 @@ internal fun fromJsonListAnyColumns(
465467
v.intOrNull != null -> collector.add(v.int)
466468
v.longOrNull != null -> collector.add(v.long)
467469
v.doubleOrNull != null -> collector.add(v.double)
468-
// v.floatOrNull != null -> collector.add(v.float)
470+
v.floatOrNull != null -> collector.add(v.float)
469471
v.jsonPrimitive is JsonNull -> collector.add(null)
470472
}
471473
}
@@ -779,8 +781,8 @@ internal fun fromJsonListArrayAndValueColumns(
779781
v.booleanOrNull != null -> collector.add(v.boolean)
780782
v.intOrNull != null -> collector.add(v.int)
781783
v.longOrNull != null -> collector.add(v.long)
782-
// v.floatOrNull != null -> collector.add(v.float)
783784
v.doubleOrNull != null -> collector.add(v.double)
785+
v.floatOrNull != null -> collector.add(v.float)
784786
v is JsonNull -> collector.add(null)
785787
else -> collector.add(v)
786788
}
@@ -903,10 +905,6 @@ private val valueTypes =
903905
@OptIn(ExperimentalSerializationApi::class)
904906
private fun convert(value: Any?): JsonElement = when (value) {
905907
is JsonElement -> value
906-
is Double -> JsonPrimitive(value)
907-
is Float -> JsonPrimitive(value.toDouble()) // It is necessary
908-
// because kotlinx-serialization accurately handles Float -> Float,
909-
// unlike klaxon.
910908
is Number -> JsonPrimitive(value)
911909
is String -> JsonPrimitive(value)
912910
is Char -> JsonPrimitive(value.toString())

core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/json.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ import org.jetbrains.kotlinx.dataframe.api.getColumnGroup
2020
import org.jetbrains.kotlinx.dataframe.api.getFrameColumn
2121
import org.jetbrains.kotlinx.dataframe.api.schema
2222
import org.jetbrains.kotlinx.dataframe.api.toDouble
23+
import org.jetbrains.kotlinx.dataframe.api.toFloat
2324
import org.jetbrains.kotlinx.dataframe.api.toMap
25+
import org.jetbrains.kotlinx.dataframe.api.with
2426
import org.jetbrains.kotlinx.dataframe.columns.ColumnGroup
2527
import org.jetbrains.kotlinx.dataframe.columns.FrameColumn
2628
import org.jetbrains.kotlinx.dataframe.columns.ValueColumn
@@ -29,6 +31,7 @@ import org.jetbrains.kotlinx.dataframe.io.JSON.TypeClashTactic.*
2931
import org.jetbrains.kotlinx.dataframe.type
3032
import org.jetbrains.kotlinx.dataframe.values
3133
import org.junit.Test
34+
import kotlin.math.exp
3235
import kotlin.reflect.*
3336

3437
class JsonTests {
@@ -382,15 +385,16 @@ class JsonTests {
382385
fun `NaN float serialization`() {
383386
val df = dataFrameOf("v")(1.1f, Float.NaN)
384387
df["v"].type() shouldBe typeOf<Float>()
385-
DataFrame.readJsonStr(df.toJson()) shouldBe df.convert("v").toDouble()
388+
val actual = DataFrame.readJsonStr(df.toJson()).convert("v").toFloat()
389+
actual shouldBe df
386390
}
387391

388392
@Test
389393
fun `NaN float serialization Any`() {
390394
val df = dataFrameOf("v")(1.1f, Float.NaN)
391395
df["v"].type() shouldBe typeOf<Float>()
392-
DataFrame.readJsonStr(df.toJson(), typeClashTactic = ANY_COLUMNS) shouldBe df.convert("v")
393-
.toDouble()
396+
val actual = DataFrame.readJsonStr(df.toJson(), typeClashTactic = ANY_COLUMNS).convert("v").toFloat()
397+
actual shouldBe df
394398
}
395399

396400
@Test

0 commit comments

Comments
 (0)