You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Map serialization/deserialization is broken if the key doesn't have a KeyReads instance.
The problem stems from the LowPriorityKeyReads.readableKeyReads which implies that if you have a Reads[A] then you have KeyReads[A], which does not seem like a logical conclusion. After all, the Reads can expect JsArray, JsObject or any other type, none of which are JsString.
importplay.api.libs.json.*valmap=Map((1, 2) ->"foo")
valasJson=Json.prettyPrint(Json.toJson(map))
println(asJson)
// Gets serialized to: [ [ [ 1, 2 ], "foo" ] ]valfromJson=Json.parse(asJson).validate[Map[(Int, Int), String]]
println(fromJson)
// Fails to deserialize, as a failing `KeyReads[(Int, Int)]` will be created from `LowPriorityKeyReads.readableKeyReads`
Suggested solution
Remove LowPriorityKeyReads.readableKeyReads. This breaks backwards compatibility, but I argue that this function is useless (as in it almost never produces a useful Reads instance anyway).
Play JSON Version (2.5.x / etc)
3.0.1
API (Scala / Java / Neither / Both)
Scala
Problem
Map serialization/deserialization is broken if the key doesn't have a
KeyReads
instance.The problem stems from the
LowPriorityKeyReads.readableKeyReads
which implies that if you have aReads[A]
then you haveKeyReads[A]
, which does not seem like a logical conclusion. After all, theReads
can expectJsArray
,JsObject
or any other type, none of which areJsString
.Suggested solution
Remove
LowPriorityKeyReads.readableKeyReads
. This breaks backwards compatibility, but I argue that this function is useless (as in it almost never produces a usefulReads
instance anyway).Reproducible Test Case
https://scastie.scala-lang.org/8ePgBH6lQ5i4GmCOPksvyw
The text was updated successfully, but these errors were encountered: