Skip to content

Commit ff4b750

Browse files
committed
refactor: improve JsonConverter and CirceSchema methods
- Renamed variables in `toJson` and `toObject` methods for clarity in `JsonConverter`. - Enhanced `encodeAnyToJson` in `CirceSchema` to handle `Option` types directly.
1 parent 22610ba commit ff4b750

File tree

10 files changed

+64
-26
lines changed

10 files changed

+64
-26
lines changed

build.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ developers := List(
2020

2121
licenses += ("Apache-2.0", url("https://www.apache.org/licenses/LICENSE-2.0.html"))
2222

23-
crossScalaVersions := Seq("3.7.0", "2.13.16")
23+
crossScalaVersions := Seq("3.7.2", "2.13.16")
2424

2525
scalaVersion := crossScalaVersions.value.last
2626

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name" : "mongodb-driver",
33
"organization" : "dev.mongocamp",
4-
"version" : "3.0.8.snapshot",
4+
"version" : "3.0.8",
55
"author" : "[email protected]",
66
"license" : "Apache-2.0",
77
"type" : "module",

project/build.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
sbt.version=1.11.2
1+
sbt.version=1.11.5

src/main/scala/dev/mongocamp/driver/mongodb/json/CirceSchema.scala

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,10 @@ trait CirceSchema extends CirceProductSchema {
127127
}
128128

129129
implicit val AnyFormat: Encoder[Any] with io.circe.Decoder[Any] = new io.circe.Encoder[Any] with io.circe.Decoder[Any] {
130-
override def apply(a: Any): Json = encodeAnyToJson(a)
130+
131+
override def apply(a: Any): Json = {
132+
encodeAnyToJson(a)
133+
}
131134

132135
override def apply(c: HCursor): Result[Any] = {
133136
Decoder.decodeJson
@@ -136,6 +139,7 @@ trait CirceSchema extends CirceProductSchema {
136139
)
137140
.apply(c)
138141
}
142+
139143
}
140144

141145
def encodeMapStringAny(a: Map[String, Any]): Json = {
@@ -189,14 +193,20 @@ trait CirceSchema extends CirceProductSchema {
189193

190194
def encodeAnyToJson(a: Any, deepth: Int = 0): Json = {
191195
a match {
192-
case s: String => Json.fromString(s)
193-
case b: Boolean => Json.fromBoolean(b)
194-
case l: Long => Json.fromLong(l)
195-
case i: Int => Json.fromInt(i)
196-
case bi: BigInt => Json.fromBigInt(bi)
197-
case bd: BigDecimal => Json.fromBigDecimal(bd)
198-
case d: Double => Json.fromDoubleOrNull(d)
199-
case f: Float => Json.fromFloatOrNull(f)
196+
case s: String => Json.fromString(s)
197+
case b: Boolean => Json.fromBoolean(b)
198+
case l: Long => Json.fromLong(l)
199+
case i: Int => Json.fromInt(i)
200+
case bi: BigInt => Json.fromBigInt(bi)
201+
case bd: BigDecimal => Json.fromBigDecimal(bd)
202+
case d: Double => Json.fromDoubleOrNull(d)
203+
case f: Float => Json.fromFloatOrNull(f)
204+
case option: Option[_] =>
205+
option
206+
.map(
207+
e => encodeAnyToJson(e, deepth)
208+
)
209+
.getOrElse(Json.Null)
200210
case d: Date => Encoder.encodeString.apply(d.toInstant.toString)
201211
case d: DateTime => Encoder.encodeString.apply(d.toInstant.toString)
202212
case o: ObjectId => Encoder.encodeString.apply(o.toHexString)

src/main/scala/dev/mongocamp/driver/mongodb/json/JsonConverter.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,18 @@ package dev.mongocamp.driver.mongodb.json
33
import better.files.Resource
44
import com.typesafe.scalalogging.LazyLogging
55
import io.circe.jawn.decode
6-
import io.circe.syntax._
76
import io.circe.Decoder
87
import io.circe.Encoder
98

109
class JsonConverter(dropNullValues: Boolean = false, defaultShouldLogAsError: Boolean = false) extends CirceSchema with LazyLogging {
1110

12-
def toJson[A <: Any](s: A)(implicit encoder: Encoder[A]): String = {
11+
def toJson[A <: Any](a: A)(implicit encoder: Encoder[A]): String = {
12+
import io.circe.syntax._
1313
if (dropNullValues) {
14-
s.asJson.deepDropNullValues.noSpaces
14+
a.asJson.deepDropNullValues.noSpaces
1515
}
1616
else {
17-
s.asJson.noSpaces
17+
a.asJson.noSpaces
1818
}
1919
}
2020

@@ -37,14 +37,14 @@ class JsonConverter(dropNullValues: Boolean = false, defaultShouldLogAsError: Bo
3737
toObjectOption[A](jsonString, defaultShouldLogAsError).getOrElse(null.asInstanceOf[A])
3838
}
3939

40-
def toObject[A](jsonString: String, shouldLogError: Boolean = defaultShouldLogAsError)(implicit decoder: Decoder[A]): A = {
41-
toObjectOption[A](jsonString, shouldLogError).getOrElse(null.asInstanceOf[A])
40+
def toObject[A](jsonString: String, shouldLogAsError: Boolean = defaultShouldLogAsError)(implicit decoder: Decoder[A]): A = {
41+
toObjectOption[A](jsonString, shouldLogAsError).getOrElse(null.asInstanceOf[A])
4242
}
4343

44-
def toObjectOption[A](jsonString: String, shouldLogError: Boolean = defaultShouldLogAsError)(implicit decoder: Decoder[A]): Option[A] = {
44+
def toObjectOption[A](jsonString: String, shouldLogAsError: Boolean = defaultShouldLogAsError)(implicit decoder: Decoder[A]): Option[A] = {
4545
val decodeResponse = toObjectRaw[A](jsonString)
4646
if (decodeResponse.isLeft) {
47-
if (shouldLogError) {
47+
if (shouldLogAsError) {
4848
logger.error(s"Error while decoding json: ${decodeResponse.left}")
4949
}
5050
else {

src/test/scala/dev/mongocamp/driver/mongodb/json/JsonConversionSuite.scala

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package dev.mongocamp.driver.mongodb.json
2-
import io.circe.ACursor
3-
import io.circe.DecodingFailure
2+
import dev.mongocamp.driver.mongodb.json.model.FooBar
3+
import dev.mongocamp.driver.mongodb.json.model.HelloWorld
4+
import dev.mongocamp.driver.mongodb.json.model.HelloWorld2
5+
import dev.mongocamp.driver.mongodb.json.model.HelloWorld3
46
import io.circe.ParsingFailure
57
import org.typelevel.jawn.IncompleteParseException
68

7-
case class HelloWorld(greetings: String, name: String)
8-
case class HelloWorld2(greetings: String, name: String, option: Option[HelloWorld], subClass: List[Long])
9-
109
class JsonConversionSuite extends munit.FunSuite {
11-
protected lazy val jsonConverter = new JsonConverter()
10+
protected lazy val jsonConverter = new JsonConverter()
11+
protected lazy val dropNullConverter = new JsonConverter(dropNullValues = true)
1212

1313
test("Convert to List to Json") {
1414
assertEquals(jsonConverter.toJson(Array(1, 2)), "[1,2]")
@@ -19,6 +19,22 @@ class JsonConversionSuite extends munit.FunSuite {
1919
assertEquals(jsonConverter.toJson(Array("hallo", "Welt")), "[\"hallo\",\"Welt\"]")
2020
}
2121

22+
test("Convert Case Class with Any to Json") {
23+
val isScala3 = scala.util.Properties.versionNumberString.startsWith("3.")
24+
val jString3: String = if (isScala3) {
25+
jsonConverter.toJson(HelloWorld3("servus", "welt"))
26+
}
27+
else {
28+
jsonConverter.toJson(HelloWorld3("servus", "welt").asInstanceOf[Any])
29+
}
30+
assertEquals(jString3, "{\"greetings\":\"servus\",\"name\":\"welt\"}")
31+
}
32+
33+
test("Convert Json to Case Class with Option using anyFormat") {
34+
assertEquals(jsonConverter.toJson(FooBar()), "{\"foo\":null,\"bar\":null}")
35+
assertEquals(dropNullConverter.toJson(FooBar()), "{}")
36+
}
37+
2238
test("Convert Case Class to Json") {
2339
assertEquals(jsonConverter.toJson(HelloWorld("hello", "world")), "{\"greetings\":\"hello\",\"name\":\"world\"}")
2440
assertEquals(jsonConverter.toJson(HelloWorld("servus", "welt")), "{\"greetings\":\"servus\",\"name\":\"welt\"}")
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package dev.mongocamp.driver.mongodb.json.model
2+
3+
case class FooBar(foo: Option[String] = None, bar: Option[Long] = None)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package dev.mongocamp.driver.mongodb.json.model
2+
3+
case class HelloWorld(greetings: String, name: String)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package dev.mongocamp.driver.mongodb.json.model
2+
3+
case class HelloWorld2(greetings: String, name: String, option: Option[HelloWorld], subClass: List[Long])
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package dev.mongocamp.driver.mongodb.json.model
2+
3+
case class HelloWorld3(greetings: String, name: Any)

0 commit comments

Comments
 (0)