2013-03-12 6 views
3

Прежде всего, я довольно новичок в игре 2 Scala. Я пытаюсь написать преобразование моего объекта модели в/из JSON.JSON deserializer for Anorm

Согласно этому блогу http://mandubian.com/2012/10/01/unveiling-play-2-dot-1-json-api-part2-writes-format-combinators/ Это то, что я попытался

case class Facility(id:Pk[Int],name:String) 

object Facility{ 

    implicit val facilityWriter = (
    (__ \ "id").write[Pk[Int]] and 
    (__ \ "name").write[String] 
)(unlift(Facility.unapply)) 

Затем он дал мне ошибку говоря, что ни JSON десериализатор не найдено для Pk [Int]

Так Ive пытался что-то вроде этого (после того, как немного прибегая к помощи вокруг)

implicit object PkFormat extends Format[Pk[Int]] { 

    def reads(json:JsValue): Pk[Int] = Id(json.as[Int]) 
    def writes(id:Pk[Int]):JsNumber = JsNumber(id.get) 
} 

Я не понимаю, что именно происходит, и coudlnt найти пример вывода n как сериализовать/десериализовать анорму.

ответ

5

Сериализатор/десериализатор JSON поддерживает все основные значения, которые покрываются спецификацией JSON. Если вы хотите сериализовать настраиваемый тип, вы должны сказать сериализатору, как это сделать.

Серийный анализатор Play JSON использует шаблон Scala (первоначально Haskell), называемый тип класса. В двух словах он допускает полиморфизм без подкласса. Это достигается путем приведения неявного значения в область видимости, т. Е. Для обработки нового типа, вы определяете неявное значение/метод/объект. В вашем конкретном примере вы определяете экземпляр класса типа для Pk[Int].

Вы можете преобразовать Pk[Int] вручную в коде, или как и во многих других рамках реализации преобразования в Pk классе непосредственно, но класс типа подход чище (потому что преобразование JSON является отдельной проблемой) и проще для повторного использования (теперь вы можете конвертировать Pk[Int] в любом месте, даже если сам класс Pk его не поддерживает, представьте, что вы расширяете систему с закрытым исходным кодом).

Как ваш код, он должен просто работать нормально, просто убедитесь, что у вас есть необходимые импорта в объеме:

import play.api.libs.json._ 
import play.api.libs.json.util._ 
import play.api.libs.json.Writes._ 
import play.api.libs.functional.syntax._ 
+1

Спасибо за объяснение .. Пришлось копать глубоко в implicits и классов типов, но полностью чувствовал стоило того. – smk

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