From 0dc7f3daf5afc195745bbc2d7b7ade010279cd32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Cio=C5=82ecki?= Date: Tue, 26 Nov 2024 10:12:00 +0100 Subject: [PATCH] Improvemetns --- .../engine/util/json/ToJsonEncoder.scala | 36 +++++++++++-------- .../engine/util/json/ToJsonEncoderSpec.scala | 30 +++++++++------- 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/utils/utils/src/main/scala/pl/touk/nussknacker/engine/util/json/ToJsonEncoder.scala b/utils/utils/src/main/scala/pl/touk/nussknacker/engine/util/json/ToJsonEncoder.scala index 26681f5e7c5..fd09fd1e518 100644 --- a/utils/utils/src/main/scala/pl/touk/nussknacker/engine/util/json/ToJsonEncoder.scala +++ b/utils/utils/src/main/scala/pl/touk/nussknacker/engine/util/json/ToJsonEncoder.scala @@ -69,14 +69,15 @@ case class ToJsonEncoder( case a: OffsetDateTime => Encoder[OffsetDateTime].apply(a) case a: UUID => safeString(a.toString) case a: DisplayJson => a.asJson - case a: scala.collection.Map[_, _] => encodeMap(a.toMap) - case a: java.util.Map[_, _] => encodeMap(a.asScala.toMap) - case a: Iterable[_] => fromValues(a.map(encode)) - case a: Enum[_] => safeString(a.toString) - case a: java.util.Collection[_] => fromValues(a.asScala.map(encode)) - case a: Array[_] => fromValues(a.map(encode)) - case _ if !failOnUnknown => safeString(any.toString) - case a => throw new IllegalArgumentException(s"Invalid type: ${a.getClass}") + case a: scala.collection.immutable.ListMap[_, _] => encodeListMap(a) + case a: scala.collection.Map[_, _] => encodeMap(a.toMap) + case a: java.util.Map[_, _] => encodeMap(a.asScala.toMap) + case a: Iterable[_] => fromValues(a.map(encode)) + case a: Enum[_] => safeString(a.toString) + case a: java.util.Collection[_] => fromValues(a.asScala.map(encode)) + case a: Array[_] => fromValues(a.map(encode)) + case _ if !failOnUnknown => safeString(any.toString) + case a => throw new IllegalArgumentException(s"Invalid type: ${a.getClass}") } ) @@ -86,17 +87,22 @@ case class ToJsonEncoder( case None => Null } + private def encodeListMap(value: scala.collection.immutable.ListMap[_, _]): Json = { + val mapWithStringKeys = value.toList.map { case (k, v) => + k.toString -> encode(v) + } + + fromFields(mapWithStringKeys) + } + // TODO: make encoder aware of NU Types to encode things like multiset differently. Right now its handled by calling // toString on keys. private def encodeMap(map: Map[_, _]) = { - // TODO: Switch to SeqMap after removing support for Scala 2.12 - val mapWithStringKeys = ListMap.from( - map.toList.map { case (k, v) => - k.toString -> v - } - ) + val mapWithStringKeys = map.view.map { case (k, v) => + k.toString -> encode(v) + }.toMap - fromFields(mapWithStringKeys.mapValuesNow(encode)) + fromFields(mapWithStringKeys) } } diff --git a/utils/utils/src/test/scala/pl/touk/nussknacker/engine/util/json/ToJsonEncoderSpec.scala b/utils/utils/src/test/scala/pl/touk/nussknacker/engine/util/json/ToJsonEncoderSpec.scala index e82fe7490a4..0f44d7aacee 100644 --- a/utils/utils/src/test/scala/pl/touk/nussknacker/engine/util/json/ToJsonEncoderSpec.scala +++ b/utils/utils/src/test/scala/pl/touk/nussknacker/engine/util/json/ToJsonEncoderSpec.scala @@ -103,20 +103,26 @@ class ToJsonEncoderSpec extends AnyFunSpec with Matchers { } it("should convert map to json and keep order of keys") { - val map = ListMap( - "intNumber" -> 42, - "floatNumber" -> 42.42, - "someTimestamp" -> 1496930555793L, - "someString" -> "hello", - "booleanValue" -> true + val nestedMap = ListMap( + "first" -> ListMap( + "b" -> 2, + "a" -> 1, + ), + "second" -> ListMap( + "x" -> 3, + "y" -> 4 + ) ) - encoder.encode(map) shouldBe Json.obj( - "intNumber" -> fromInt(42), - "floatNumber" -> fromFloatOrNull(42.42f), - "someTimestamp" -> fromLong(1496930555793L), - "someString" -> fromString("hello"), - "booleanValue" -> fromBoolean(true), + encoder.encode(nestedMap) shouldBe Json.obj( + "first" -> Json.obj( + "b" -> fromInt(2), + "a" -> fromInt(1), + ), + "second" -> Json.obj( + "x" -> fromInt(3), + "y" -> fromInt(4) + ) ) }