2014-04-10 4 views
13

Я использую последнюю версию Play Framework, и это JSON lib нравится Json.toJson(obj). Но toJson не способен преобразовать какой-либо объект Scala в JSON, поскольку структура данных неизвестна. Кто-то предложил использовать конвертирование case, но здесь мои знания Scala не оправдались. Данные поступают из базы данных, но структура таблицы неизвестна.Конвертировать любой объект Scala в JSON

Где я должен искать дальше, чтобы преобразовать такую ​​неизвестную структуру данных в JSON?

+0

Как об использовании 'Format [T]' (см http://www.playframework.com/documentation/2.2.x/ScalaJsonCombinators) Вы должны знать тип 'Т * однако, во время компиляции, из вопроса я не уверен, что это будет проблемой. – tehlexx

+0

Спасибо за ссылку, я проверил параметр Format [T], но мне кажется, что мне нужно знать структуру данных в случае ее использования. Но когда я конвертирую результат из базы данных в Map, структура [String, Any] - так в основном неизвестна. – Vilis

+0

Я сопоставил данные с '' asMap'' в формате '' [String, Any] '', но при попытке преобразовать такую ​​структуру с '' toJson'' Scala выдает ошибку - '' No Json serializer найден для типа List [scala.collection.Map [String, Any]] '' – Vilis

ответ

5

Учитывая, что существует лишь ограниченное число типов, которые вы хотите сериализовать в формате JSON, это должно работать:

object MyWriter { 
    implicit val anyValWriter = Writes[Any] (a => a match { 
    case v:String => Json.toJson(v) 
    case v:Int => Json.toJson(v) 
    case v:Any => Json.toJson(v.toString) 
    // or, if you don't care about the value 
    case _ => throw new RuntimeException("unserializeable type") 
    }) 
} 

Вы можете использовать его, а затем путем импорта неявное значение в точке, где вы хотите сериализовать Any:

import MyWriter.anyValWriter 
val a: Any = "Foo" 
Json.toJson(a) 
+0

Спасибо, это почти идеальное решение. Как вы поймаете любое значение, которое не является String или Int? Он может быть отправлен в String или вообще проигнорирован. – Vilis

+0

Я обновил ответ, чтобы показать это. – tehlexx

+0

Спасибо! Теперь есть еще одна проблема: список и карта преобразуются в строку. Конечным результатом в JSON является буквально эта строка '' "List (Map (users.id -> 1, users.status -> 1))" '' – Vilis

Смежные вопросы