2014-09-18 4 views
12

Как преобразовать в серию карту [String, Any] с помощью распылителя-json? Я стараюсьСериализовать карту [Строка, Любой] с помощью аэрозоля json

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

В нем указано Cannot find JsonWriter or JsonFormat type class for scala.collection.immutable.Map[String,Any].

ответ

21

Вот неявный конвертер Я использовал для выполнения этой задачи:

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 
    } 
    } 

Она была заимствована из this post в группе пользователей спрейте, но я не мог и не нужна писать вложенную последовательность и карты к Json, поэтому я их вынул.

+2

Awesome, это работает для меня. Мне просто нужно убедиться, что я объявляю этот объект ДО других JsonFormat, которые зависят от него. – Bogdan

+1

В вашем коде отсутствует '' '. – dividebyzero

+0

Действительно. Обновлено. – Gangstead

5

Другой вариант, который должен работать в вашем случае,

data.parseJson.convertTo[Map[String, JsValue]] 
+0

Мне нравится, что вы упомянули об этом, потому что во многих случаях использование 'JsValue' для значений может будет достаточно для людей. Это также в большей степени соответствует ментальности spray.json, imho, чем обработке Any's. – akauppi

+2

'data' имеет тип' Map [String, Any] '- что мне импортировать, чтобы он имел метод parseJson? – mirelon