Каков самый простой способ анализа JSON в Scala?
Я работаю над простым веб-приложением с Scala. План состоит в том, чтобы получить данные JSON из внешнего API и вставить его в шаблон (к сожалению, получение данных в XML не является опцией).
Я пробовал работать с библиотекой scala-json Twitter, но я не могу заставить ее правильно компилироваться (код на github не обновляется в sbt, говоря, что standard-project 7.10 недоступен, и я еще не разработал это).
lift-json выглядит впечатляюще, но кажется, это намного сложнее, чем мне сейчас нужно.
попытка импортировать библиотеку, с которой я работал в Java, jsonic, приводит к различным тайным ошибкам. Это слишком плохо, потому что мне нравится, насколько прост jsonic.
Я немного продвинулся со встроенным scala.утиль.разбор.формат JSON.JSON, но на самом деле я не могу сказать, как получить доступ к элементам. Я несколько новичок в скале, как вы могли заметить. Как получить доступ к свойствам Объекты jsonobject?
scala.утиль.разбор.формат JSON.В JSON есть много информации, но есть простой учебник о том, как использовать это в любом месте?
меня действительно интересует только десериализация JSON на данный момент, в Ints, строки, карты и списки. У меня нет необходимости сериализовывать объекты или помещать десериализованные объекты в класс на данный момент.
может ли кто-нибудь указать мне способы работы с одной из вышеупомянутых библиотек или помочь мне настроить Java lib, который будет делать то, что я хочу?
2 ответов
Lift JSON предоставляет несколько различных стилей десериализации JSON. У каждого свои плюсы и минусы.
val json = JsonParser.parse(""" { "foo": { "bar": 10 }} """)
LINQ стиль понимания запросов:
scala> for { JField("bar", JInt(x)) <- json } yield x
res0: List[BigInt] = List(10)
больше примеров: http://github.com/lift/lift/blob/master/framework/lift-base/lift-json/src/test/scala/net/liftweb/json/QueryExamples.scala
извлечь значения с case-классы
implicit val formats = net.liftweb.json.DefaultFormats
case class Foo(foo: Bar)
case class Bar(bar: Int)
json.extract[Foo]
больше примеров: https://github.com/lift/lift/blob/master/framework/lift-base/lift-json/src/test/scala/net/liftweb/json/ExtractionExamples.scala
XPath стиль
scala> val JInt(x) = json \ "foo" \ "bar"
x: BigInt = 10
Non-type безопасные значения
scala> json.values
res0: Map((foo,Map(bar -> 10)))
вот быстрые примеры десериализации необработанной строки JSON в модель класса case для разных Scala JSON библиотеки:
import play.api.libs.json._
case class User(id: Int, name: String)
object User {
implicit val codec = Json.format[User]
}
object PlayJson extends App {
val string = """{"id": 124, "name": "John"}"""
val json = Json.parse(string)
val user = json.as[User]
println(user)
}
import net.liftweb.json._
case class User(id: Int, name: String)
object LiftJson extends App {
implicit val codec = DefaultFormats
val string = """{"id": 124, "name": "John"}"""
val json = parse(string)
val user = json.extract[User]
println(user)
}
import spray.json._
import DefaultJsonProtocol._
case class User(id: Int, name: String)
object UserJsonProtocol extends DefaultJsonProtocol {
implicit val codec = jsonFormat2(User)
}
object SprayJson extends App {
import UserJsonProtocol._
val string = """{"id": 124, "name": "John"}"""
val json = string.parseJson
val user = json.convertTo[User]
println(user)
}
import io.sphere.json.generic._
import io.sphere.json._
case class User(id: Int, name: String)
object SphereJson extends App {
implicit val codec = deriveJSON[User]
val string = """{"id": 124, "name": "John"}"""
val user = fromJSON[User](string)
println(user)
}
import argonaut._
import Argonaut._
case class User(id: Int, name: String)
object ArgonautJson extends App {
implicit def codec = casecodec2(User.apply, User.unapply)("id", "name")
val string = """{"id": 124, "name": "John"}"""
val user = string.decodeOption[User]
println(user)
}
import io.circe.generic.auto._
import io.circe.parser._
case class User(id: Int, name: String)
object CirceJson extends App {
val string = """{"id": 124, "name": "John"}"""
val user = decode[User](string)
println(user)
}
Вот зависимости Для выше примеры:
resolvers += Resolver.bintrayRepo("commercetools", "maven")
libraryDependencies ++= Seq(
"com.typesafe.play" %% "play-json" % "2.6.7",
"net.liftweb" %% "lift-json" % "3.1.1",
"io.spray" %% "spray-json" % "1.3.3",
"io.sphere" %% "sphere-json" % "0.9.0",
"io.argonaut" %% "argonaut" % "6.2",
"io.circe" %% "circe-core" % "0.8.0",
"io.circe" %% "circe-generic" % "0.8.0",
"io.circe" %% "circe-parser" % "0.8.0"
)
этот пост был вдохновлен следующие статьи: быстрый тур по библиотекам JSON в Scala
связанный так вопрос:какую библиотеку JSON использовать в Scala?