Skip to content

Commit fa9efe7

Browse files
committed
Fix Json encoding of non-string map keys
1 parent 5be0806 commit fa9efe7

2 files changed

Lines changed: 10 additions & 6 deletions

File tree

json/src/main/scala/proteus/json/package.scala

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,10 @@ implicit def jsonWriterCodec[A](using codec: ProtobufCodec[A], registry: Registr
7575
val it = c.deconstructor.deconstruct(b.asInstanceOf[m[k, v]])
7676
val builder = List.newBuilder[Json]
7777
while (it.hasNext) {
78-
val v = it.next
79-
builder +=
80-
Json.obj(
81-
loop(c.deconstructor.getKey(v), c.element.fields(0).asInstanceOf[SimpleField[?]].codec, offset).asString.getOrElse("") ->
82-
loop(c.deconstructor.getValue(v), c.element.fields(1).asInstanceOf[SimpleField[?]].codec, offset)
83-
)
78+
val v = it.next
79+
val key = loop(c.deconstructor.getKey(v), c.element.fields(0).asInstanceOf[SimpleField[?]].codec, offset)
80+
val value = loop(c.deconstructor.getValue(v), c.element.fields(1).asInstanceOf[SimpleField[?]].codec, offset)
81+
builder += Json.obj(key.asString.getOrElse(key.noSpaces) -> value)
8482
}
8583
Json.arr(builder.result()*)
8684
case Bytes => Json.fromString("<bytes>")

json/src/test/scala/proteus/json/JsonSpec.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,12 @@ object JsonSpec extends ZIOSpecDefault {
184184
val result = instance.asJson.noSpaces
185185
assertTrue(result == """{"data":[{"one":1},{"two":2}]}""" || result == """{"data":[{"two":2},{"one":1}]}""")
186186
},
187+
test("toJson serializes Map[Int, Int]") {
188+
case class MapMessage(data: Map[Int, Int]) derives Schema, ProtobufCodec
189+
val instance = MapMessage(Map(1 -> 1, 2 -> 2))
190+
val result = instance.asJson.noSpaces
191+
assertTrue(result == """{"data":[{"1":1},{"2":2}]}""" || result == """{"data":[{"2":2},{"1":1}]}""")
192+
},
187193
test("toJson serializes empty Map") {
188194
case class MapMessage(data: Map[String, String]) derives Schema, ProtobufCodec
189195
val instance = MapMessage(Map.empty)

0 commit comments

Comments
 (0)