Скала в JSON в Play Framework 2.1

я пытаюсь конвертировать Scala в JSON в 2.1RC Play Framework.

Я могу сделать следующее и получить JSON:

import play.api.libs.json._

val a1=Map("val1"->"a", "val2"->"b")
Json.toJSon(a1)

Потому что a1 - это просто Map [String, String], которая работает нормально.

Но если у меня есть что-то более сложное, например, где у меня есть Map [String, Object], это нет работа:

val a = Map("val1" -> "xxx", "val2"-> List("a", "b", "c"))
Json.toJSon(a1)
>>> error: No Json deserializer found for type scala.collection.immutable.Map[String,Object]

Я обнаружил, что могу сделать что-то вроде следующего:

val a2 = Map("val1" -> Json.toJson("a"), "val2" -> Json.toJson(List("a", "b", "c")))
Json.toJson(a2)

И это работает.

Но как я могу сделать это в целом? Я думал, что мог бы сделать что-то вроде следующего:

a.map{ case(k,v)=> (k, Json.toJson(v) )}
>>> error: No Json deserializer found for type Object

Но я все еще получаю сообщение об ошибкебыть десериализованным

Дополнительная информация:

Json.toJson может преобразовать Map [String, String] в JsValue:

scala> val b = Map( "1" -> "A", "2" -> "B", "3" -> "C", "4" -> "D" )
b: scala.collection.immutable.Map[String,String] = Map(1 -> A, 2 -> B, 3 -> C, 4 -> D)

scala> Json.toJson(b)
res31: play.api.libs.json.JsValue = {"1":"A","2":"B","3":"C","4":"D"}

Но он не может конвертировать карту [String, Object]:

scala> a
res34: scala.collection.immutable.Map[String,Object] = Map(val1 -> xxx, val2 -> List(a, b, c))

scala> Json.toJson(a)
:12: error: No Json deserializer found for type scala.collection.immutable.Map[String,Object]. Try to implement an implicit Writes or Format for this type.
          Json.toJson(a)

С использованием 'намек» На этой странице Play Framework, посвященной конвертации Scala в Json, я обнаружил следующее (http://www.playframework.org/documentation/2.0.1/ScalaJson):

Если вместо Map [String, Object] есть Map [String, JsValue], то Json.toJson () будет работать:

scala> val c = Map("aa" -> Json.toJson("xxxx"), "bb" -> Json.toJson( List("11", "22", "33") ) )
c: scala.collection.immutable.Map[String,play.api.libs.json.JsValue] = Map(aa -> "xxxx", bb -> ["11","22","33"])

scala> Json.toJson(c)
res36: play.api.libs.json.JsValue = {"aa":"xxxx","bb":["11","22","33"]}

Итак, что я хотел бы, это учитывая Map [String, Object], где я знаю, что все значения Object изначально были типа String или List [String], как применить функцию Json.toJson () ко всем значения в карте и получить карту [String, JsValue].

Я также обнаружил, что могу отфильтровать только те значения, которые являются строковыми, и те, которые (были) имеют тип List [String]:

scala> val a1 = a.filter({case(k,v) => v.isInstanceOf[String]})
a1: scala.collection.immutable.Map[String,Object] = Map(val1 -> xxx)

scala> val a2 = a.filter({case(k,v) => v.isInstanceOf[List[String]]})
:11: warning: non-variable type argument String in type List[String] is unchecked since it is eliminated by erasure
   val a2 = a.filter({case(k,v) => v.isInstanceOf[List[String]]})
                                                 ^
a2: scala.collection.immutable.Map[String,Object] = Map(val2 -> List(a, b, c))

Фильтрация списка [String] выдает предупреждение, но, кажется, дает ответ, который я хочу. Если бы можно было применить два фильтра, а затем использовать Json.toJson () для значений результата и объединить результаты, может быть, это сработает?

Но отфильтрованные результаты по-прежнему имеют тип Map [String, Object], что вызывает проблему:

scala> Json.toJson(a1)
:13: error: No Json deserializer found for type scala.collection.immutable.Map[String,Object]. Try to implement an implicit Writes or Format for this type.
          Json.toJson(a1)

Ответы на вопрос(1)

Ваш ответ на вопрос