Какой самый простой способ разбора JSON в Scala? - PullRequest
17 голосов
/ 13 ноября 2010

Я работаю над простым веб-приложением со Scala.Планируется получить данные JSON из внешнего API и вставить их в шаблон (к сожалению, получение данных в формате XML не вариант).

Я пробовал работать с библиотекой Twitter scala-json,но я не могу заставить его правильно скомпилироваться (код на github не обновляется в sbt, говоря, что стандартный проект 7.10 недоступен, и я еще не решил это).

lift-json выглядитВпечатляет, но, кажется, намного сложнее, чем мне нужно сейчас.

Попытка импортировать библиотеку, с которой я работал в Java, jsonic, приводит к различным непонятным ошибкам.Это очень плохо, потому что мне скорее нравится, насколько прост jsonic.

Я немного продвинулся во встроенном scala.util.parsing.json.JSON, но на самом деле не могу сказать, какполучить доступ к элементам.Как вы могли заметить, я немного новичок в Scala.Как получить доступ к свойствам JSONObjects?

scala.util.parsing.json.JSON содержит много информации, но есть ли простое руководство о том, как его использовать где угодно?

В настоящий момент меня интересует только десериализация JSON, Ints, Strings, Maps и Lists.У меня нет необходимости сериализовывать объекты или делать десериализованные объекты вписывающимися в класс в настоящий момент.

Может кто-нибудь указать мне способы работы с одной из вышеупомянутых библиотек или помочь мне настроитьс библиотекой Java, которая будет делать то, что я хочу?

Ответы [ 2 ]

31 голосов
/ 13 ноября 2010

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

Извлечение значений с помощью классов дел

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

Типовые безопасные значения

scala> json.values

res0: Map((foo,Map(bar -> 10)))
0 голосов
/ 02 ноября 2017

Вот краткие примеры десериализации необработанной строки JSON в модель класса дел для различных библиотек Scala JSON:

плей-* 1005 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)
}

подъемный * 1012 JSON *

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)
}

спрей * 1019 JSON *

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)
}

Сфера-1026 * JSON *

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?

...