Подтвердить что ты не робот

Scala 2.10, его влияние на библиотеки JSON и проверку/создание класса case

В Scala 2.10, по-видимому, мы получаем улучшенное отражение.

Как это повлияет на lift-json, jerkson, sjson и друзей? Кроме того, можем ли мы ожидать в недалеком будущем встроенного языка JSON, а la Groovy отличный GSON в Scala?

Я прошу, чтобы я очень любил делать:

case class Foo(a: String, b: Int, bar: Bar)
case class Bar(c: Int)
val foo = Foo("hey", 10, Bar(23))
val json = foo.toJson

без прыжков с обручем (т.е. подготовка готовой плитки), даже с произвольно сложными графами объектов. Возможно, я слишком много прошу, но всегда можно мечтать. Пожалуйста, разрушите мои мечты 2.10 или просветите меня о том, какие новые возможности открываются с ожидаемым выпуском Scala.Next

Кроме того, что касается классов case, кажется, что для валидации/создания, валидация скаляз является подходящим оружием выбора. Это кажется замечательным, действуя как безопасный прокси для создания объекта или как сборщик ошибок. Однако, как Scewbie, я нахожу скадаз несколько сложным и сопротивляюсь темной стороне F-ing, несмотря на ее очевидную силу; -)

Во всяком случае, точка здесь, с отражением 2.10, мы должны иметь возможность привязывать во время выполнения поля от say, post формы к свойствам класса case и выполнять базовую валидацию, основанную только на типе свойства (т.е. не нужно будет указывать отдельную логику проверки, которая задает свойство foo, должна быть строкой, так как ее тип уже определен в классе case, на котором мы теперь можем правильно отразить)

Итак, возникает смелый новый мир, или существующие инструменты являются основой в обозримом будущем?

4b9b3361

Ответ 1

Предисловия

Позвольте мне дать другое решение, которое не полагается на какую-либо библиотеку на основе Java, а только на чистый Scala.

Собственно, как обсуждалось в комментариях результатов @Steve Play 2 Scala версия использовала Jerkson для сериализации Json для модели домена. Где Джеркссон является оберткой DSL вокруг очень хорошей библиотеки Java для обработки Json.

Ответ

Вышеизложенное не отвечало на ваш вопрос, так как вы спрашивали, было ли предусмотрено использование отражения и макрофункции Scala 2.10, чтобы облегчить эту задачу!!!! Исключая большинство шаблонов.

И это была очень хорошая мысль на самом деле, потому что из версии Play 2.1 API Json Scala больше не использует Джеркссона, но имеет собственный механизм.

Этот механизм фактически использует преимущества этой новой версии 2.10 Scala, введя совершенно новый API, основанный на двух вещах:

  • функциональная конструкция (Applicative Builder), адаптированная для чтения и записи экземпляров Json или Domain. Эти конструкторы используются для склеивания всех комбинаторов (для чтения или записи), чтобы определить грубые гранулированные структурированные (например, с комбинаторами Parser).
  • куча макросов, которые могут обнаружить, какие комбинаторы неявно доступны, и построят сложные для классов классов (или, по крайней мере, типов, которые имеют методы apply и unapply).

В конце дня, вот что мы можем сделать, используя этот API:

import play.api.libs.json._
import play.api.libs.functional.syntax._

case class Person(name: String, age: Int, lovesChocolate: Boolean)

implicit val personReads = Json.format[Person] //a format is a Reader and a Writer

//this format will be implicitly used by the following from/toJson functions
val person:JsResult[Person] = Json.fromJson(json) //JsResult is like JsSucces/JsError
val jsObject = Json.toJson(person)

код скопирован и адаптирован из: JSON Inception (на основе Scala 2.10 макросов)

Небольшое примечание: новый API даже достаточно умен, чтобы иметь возможность проверять "чтение" путем накопления ошибок...

Ссылки

Существует ряд блогов от @mandubian, которые я бы рекомендовал здесь, потому что они очень помогают в этом!

Заключительная записка

Печально то, что модуляция Play 2... не позволяет нам использовать этот API в одиночку! Таким образом, он должен использоваться из проигрывателя lib в целом:/ Это может измениться в будущем...

ИЗМЕНИТЬ

И будущее становится все ближе, так как Pascal имеет это repo, позволяющее нам использовать API-интерфейс play-json.

Таким образом, можно использовать это репо, пока не будет выпущено воспроизведение 2.2. В самом деле, эта версия будет полностью разделена на несколько API, таких как json или iteratees, и, таким образом, мы сможем напрямую использовать playframework repo.

Ответ 2

Jerkson обрабатывает ваш прецедент сегодня!

Json.generate(foo)

Он также поддерживает потоковые чтения и записи, которые мы широко используем в производстве.

Json.generate(foo, outputStream)
Json.parse[Foo](inputStream)

Мы изначально использовали lift-json, но отсутствие поддержки потоковой передачи для классов case сделало его непригодным для чтения и записи больших json-документов. Джеркссон также супер быстрый и отлично справляется с вложенными классами.

Ответ 3

Сделано сообщение в блоге об этом, проверьте его на http://pedrorijo.com/blog/scala-json/

Используя классы case и Play WS (уже включенные в Play Framework), вы конвертируете случай между классами json и case с помощью простого однострочного неявное

case class User(username: String, friends: Int, enemies: Int, isAlive: Boolean)

object User {
  implicit val userJsonFormat = Json.format[User]
}