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

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

Как это повлияет на lift-json, jerryson, sjson и их друзей? Кроме того, можем ли мы ожидать в не столь отдаленном будущем встроенной функции языка JSON в стиле превосходного GSON Groovy в 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. Далее

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

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

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

25
задан virtualeyes 3 January 2013 в 02:27
поделиться

1 ответ

Предисловия

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

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

Ответ

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

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

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

  • функциональная конструкция (Applicative Builder), адаптированная для возможности чтения и напишите экземпляры Json или Domain. Эти компоновщики используются для склеивания комбинаторов (как для чтения, так и для записи), чтобы определить крупнозернистую структурированную (как мы это делаем с Parser Combinators)
  • группу макросов, которые могут обнаружить, какие комбинаторы доступны неявно и построит сложные для Классов Кейса (или, по крайней мере, для типов, у которых есть методы 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! Итак, его следует использовать из play lib в целом: / Это может измениться в будущем ...

РЕДАКТИРОВАТЬ

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

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

6
ответ дан 28 November 2019 в 22:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: