Skip to content

Commit 91bea6c

Browse files
committed
Ignore JsValue to map
1 parent c581a88 commit 91bea6c

File tree

4 files changed

+22
-3
lines changed

4 files changed

+22
-3
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Play json Mapping
22
Enhance the ability to create writes and reads from complex case classes graph.
33

4-
[ ![Download](https://api.bintray.com/packages/null-vector/releases/play-json-mapping/images/download.svg?version=1.1.1) ](https://bintray.com/null-vector/releases/play-json-mapping/1.1.1/link)
4+
[ ![Download](https://api.bintray.com/packages/null-vector/releases/play-json-mapping/images/download.svg?version=1.1.2) ](https://bintray.com/null-vector/releases/play-json-mapping/1.1.2/link)
55

66
## Installation
77
Add into your `build.sbt` the following lines:

build.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ lazy val supportedScalaVersions = List(scala212, scala213)
55
lazy val commonSettings = Seq(
66
name := "play-json-mapping",
77
organization := "null-vector",
8-
version := "1.1.1",
8+
version := "1.1.2",
99
scalaVersion := scala213,
1010
crossScalaVersions := supportedScalaVersions,
1111
scalacOptions := Seq(

core/src/test/scala/org/nullvector/api/json/JsonMapperSpec.scala

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import org.nullvector.api.json.domian.{DaysOpen, Location, Monday, Money, Operat
1010
import org.scalatest.flatspec.AnyFlatSpec
1111
import org.scalatest.matchers.should.Matchers._
1212
import play.api.libs.json.{Format, JsString, Json, JsonConfiguration, Reads, Writes}
13+
import play.api.libs.json.{Format, JsNumber, JsString, JsValue, Json, JsonConfiguration, Reads, Writes}
1314

1415
class JsonMapperSpec extends AnyFlatSpec {
1516

@@ -106,5 +107,20 @@ class JsonMapperSpec extends AnyFlatSpec {
106107
.asJson.toString() shouldBe """{"productId":23,"name":"Train"}"""
107108
}
108109

110+
it should "creat a mapping of Map() with JsValue type" in {
111+
import JsonMapper._
112+
implicit val m = mappingOf[ValueMap]
113+
114+
ValueMap(Map("key" -> JsNumber(23)), JsString("a text"))
115+
.asJson.toString() shouldBe """ {"values":{"key":23},"default":"a text"} """.trim
116+
}
117+
118+
it should "map List of json values" in {
119+
implicit val jl = JsonMapper.readsOf[JsonList]
120+
}
121+
122+
case class ValueMap(values: Map[String, JsValue], default: JsString)
123+
124+
case class JsonList(list: List[JsValue])
109125
}
110126

macros/src/main/scala/org/nullvector/api/json/JsonMapperMacroFactory.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package org.nullvector.api.json
22

33
import org.nullvector.api.json.tree.{Tree => NTree}
4-
import play.api.libs.json.{Format, JsonConfiguration, Reads, Writes}
4+
import play.api.libs.json.{Format, JsValue, JsonConfiguration, Reads, Writes}
55

66
import scala.reflect.macros.blackbox
77

@@ -69,6 +69,7 @@ private object JsonMapperMacroFactory {
6969
import context.universe._
7070
val enumType = context.typeOf[Enumeration]
7171
val anyValType = context.typeOf[AnyVal]
72+
val jsValueType = context.typeOf[JsValue]
7273

7374
def extractAll(testType: context.universe.Type): NTree[context.universe.Type] = {
7475
def isSupportedTrait(aTypeClass: ClassSymbol) = aTypeClass.isTrait && aTypeClass.isSealed && !aTypeClass.fullName.startsWith("scala")
@@ -77,6 +78,7 @@ private object JsonMapperMacroFactory {
7778

7879
def extractCaseClassesFromTypeArgs(classType: Type): List[Type] = {
7980
classType.typeArgs.collect {
81+
case aType if aType <:< jsValueType => Nil
8082
case argType if isCaseOrTrait(argType) => List(classType, argType)
8183
case t => extractCaseClassesFromTypeArgs(t)
8284
}.flatten
@@ -93,6 +95,7 @@ private object JsonMapperMacroFactory {
9395
returnType
9496
}
9597
.collect {
98+
case aType if aType <:< jsValueType => Nil
9699
case aType if aType <:< anyValType => List(NTree(aType))
97100
case aType if aType.typeSymbol.owner.isType && aType.typeSymbol.owner.asType.toType =:= enumType => List(NTree(aType))
98101
case aType if isCaseOrTrait(aType) => List(extractAll(aType))

0 commit comments

Comments
 (0)