Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Serialize Map[String, Any] with spray json

How do I serialize Map[String, Any] with spray-json? I try

val data = Map("name" -> "John", "age" -> 42)
import spray.json._
import DefaultJsonProtocol._
data.toJson

It says Cannot find JsonWriter or JsonFormat type class for scala.collection.immutable.Map[String,Any].

like image 922
Yaroslav Avatar asked Sep 18 '14 15:09

Yaroslav


2 Answers

Here's an implicit converter I used to do this task:

  implicit object AnyJsonFormat extends JsonFormat[Any] {
    def write(x: Any) = x match {
      case n: Int => JsNumber(n)
      case s: String => JsString(s)
      case b: Boolean if b == true => JsTrue
      case b: Boolean if b == false => JsFalse
    }
    def read(value: JsValue) = value match {
      case JsNumber(n) => n.intValue()
      case JsString(s) => s
      case JsTrue => true
      case JsFalse => false
    }
  }

It was adapted from this post in the Spray user group, but I couldn't get and didn't need to write nested Sequences and Maps to Json so I took them out.

like image 134
Gangstead Avatar answered Nov 10 '22 01:11

Gangstead


Another option, which should work in your case, is

import spray.json._
import DefaultJsonProtocol._

data.parseJson.convertTo[Map[String, JsValue]]
like image 44
Emmanuel Ballerini Avatar answered Nov 10 '22 02:11

Emmanuel Ballerini