From cb33df09486544b784becf5a733183f973c8687b Mon Sep 17 00:00:00 2001 From: radovanradic Date: Fri, 31 May 2024 13:15:00 +0200 Subject: [PATCH 1/2] Fix map serialization when key is not string --- .../serializers/CustomizedMapSerializer.java | 2 +- .../ObjectWithMapSerializerSpec.groovy | 7 +++---- .../micronaut/serde/support/ObjectWithMap.java | 16 +++++++++++----- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/serde-support/src/main/java/io/micronaut/serde/support/serializers/CustomizedMapSerializer.java b/serde-support/src/main/java/io/micronaut/serde/support/serializers/CustomizedMapSerializer.java index 593c0a881..59f3efbb6 100644 --- a/serde-support/src/main/java/io/micronaut/serde/support/serializers/CustomizedMapSerializer.java +++ b/serde-support/src/main/java/io/micronaut/serde/support/serializers/CustomizedMapSerializer.java @@ -170,7 +170,7 @@ private void encodeMapKey(EncoderContext context, } else if (keyNode.isNull()) { throw new SerdeException("Null key for a Map not allowed in JSON"); } else if (keyNode.isBoolean() || keyNode.isNumber()) { - encoder.encodeString(keyNode.coerceStringValue()); + encoder.encodeKey(keyNode.coerceStringValue()); } else { convertMapKeyToStringAndEncode(context, encoder, keyNode.getValue()); } diff --git a/serde-support/src/test/groovy/io/micronaut/serde/support/serializers/ObjectWithMapSerializerSpec.groovy b/serde-support/src/test/groovy/io/micronaut/serde/support/serializers/ObjectWithMapSerializerSpec.groovy index 76c05cfec..566b6ea3f 100644 --- a/serde-support/src/test/groovy/io/micronaut/serde/support/serializers/ObjectWithMapSerializerSpec.groovy +++ b/serde-support/src/test/groovy/io/micronaut/serde/support/serializers/ObjectWithMapSerializerSpec.groovy @@ -5,7 +5,6 @@ import io.micronaut.core.type.Argument import io.micronaut.json.JsonMapper import io.micronaut.serde.LimitingStream import io.micronaut.serde.SerdeRegistry -import io.micronaut.serde.annotation.Serdeable import io.micronaut.serde.support.ObjectWithMap import io.micronaut.serde.support.util.JsonNodeDecoder import io.micronaut.serde.support.util.JsonNodeEncoder @@ -24,7 +23,7 @@ class ObjectWithMapSerializerSpec extends Specification { def 'test serialize object with map'() { given: - def obj = new ObjectWithMap("Object1", Map.of("item1", 1L)) + def obj = new ObjectWithMap("Object1", Map.of("item1", 1L), Map.of(1, 1L)) def encoderContext = serdeRegistry.newEncoderContext(null) def decoderContext = serdeRegistry.newDecoderContext(null) def argument = Argument.of(ObjectWithMap) @@ -36,13 +35,13 @@ class ObjectWithMapSerializerSpec extends Specification { def jsonNode = encoder.getCompletedValue() def str = jsonMapper.writeValueAsString(jsonNode) then: - str == '{"name":"Object1","mapOfLongs":{"item1":1}}' + str == '{"name":"Object1","stringLongMap":{"item1":1},"integerLongMap":{"1":1}}' when: def decoder = JsonNodeDecoder.create(jsonNode, LimitingStream.DEFAULT_LIMITS) def deserResult = deserializer.deserialize(decoder, decoderContext, argument) then: deserResult.name == obj.name - deserResult.mapOfLongs == obj.mapOfLongs + deserResult.stringLongMap == obj.stringLongMap } } diff --git a/serde-support/src/test/java/io/micronaut/serde/support/ObjectWithMap.java b/serde-support/src/test/java/io/micronaut/serde/support/ObjectWithMap.java index 1fce44a14..d07327ab0 100644 --- a/serde-support/src/test/java/io/micronaut/serde/support/ObjectWithMap.java +++ b/serde-support/src/test/java/io/micronaut/serde/support/ObjectWithMap.java @@ -7,18 +7,24 @@ @Serdeable public class ObjectWithMap { private final String name; - private final Map mapOfLongs; + private final Map stringLongMap; + private final Map integerLongMap; - public ObjectWithMap(String name, Map mapOfLongs) { + public ObjectWithMap(String name, Map stringLongMap, Map integerLongMap) { this.name = name; - this.mapOfLongs = mapOfLongs; + this.stringLongMap = stringLongMap; + this.integerLongMap = integerLongMap; } public String getName() { return name; } - public Map getMapOfLongs() { - return mapOfLongs; + public Map getStringLongMap() { + return stringLongMap; + } + + public Map getIntegerLongMap() { + return integerLongMap; } } From 10d4433ac84f9bbdbc16aff437610f711a726750 Mon Sep 17 00:00:00 2001 From: radovanradic Date: Fri, 31 May 2024 13:18:16 +0200 Subject: [PATCH 2/2] Extend test checks --- .../serde/support/serializers/ObjectWithMapSerializerSpec.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/serde-support/src/test/groovy/io/micronaut/serde/support/serializers/ObjectWithMapSerializerSpec.groovy b/serde-support/src/test/groovy/io/micronaut/serde/support/serializers/ObjectWithMapSerializerSpec.groovy index 566b6ea3f..e6881f3bb 100644 --- a/serde-support/src/test/groovy/io/micronaut/serde/support/serializers/ObjectWithMapSerializerSpec.groovy +++ b/serde-support/src/test/groovy/io/micronaut/serde/support/serializers/ObjectWithMapSerializerSpec.groovy @@ -42,6 +42,7 @@ class ObjectWithMapSerializerSpec extends Specification { then: deserResult.name == obj.name deserResult.stringLongMap == obj.stringLongMap + deserResult.integerLongMap == obj.integerLongMap } }