web-dev-qa-db-ja.com

Scala:JSONを直接ケースクラスに解析する

JSONの文字列とそれに対応するケースクラスが与えられた場合、JSONをケースクラスに解析する簡単な方法は何ですか?利用可能なライブラリは多数ありますが、Scalaはすぐにこれを実行できるようです。

JSONをケースクラスのリストに解析する必要がある場合はどうでしょうか。

更新:

Jerksonは放棄されたようです。完全なPlayまたはLiftフレームワーク、または他の重いものをインストールしたくありません。

34
SRobertJames

それを正確に行えるフレームワークがいくつかあります。

circe

今日はたくさん使いました。多くの素晴らしい機能。猫を引き込みます。

https://circe.github.io/circe/https://github.com/circe/circe

JSON4s

JSON4sは非常に成熟しており、jacksonまたはnativeJSON-Parserをサポートしています。 jerksonを置き換えるために多くのプロジェクトで使用しました。

https://github.com/json4s/json4s

play-json

完全なプレイスタックなしで使用できます。 typesafeでのplayプロジェクトの一部としての素晴らしいサポート。

http://www.playframework.com/documentation/2.0/ScalaJson

Scala-Pickling

シリアル化フレームワーク。 JSONにシリアライズ/デシリアライズするオプションがあります。

https://github.com/scala/pickling

JSONをスプレー

シリアル化および逆シリアル化できます。直列化復元が困難なため、引数の数を知る必要があります。

https://github.com/spray/spray-json

19
Andreas Neumann

私は使用しました https://github.com/json4s/json4s 、これまでのところ不満は https://github.com/json4s/json4s/issues/137

import org.json4s._
import org.json4s.native.JsonMethods._

implicit val formats = DefaultFormats

case class ParsedPage(crawlDate: String, domain:String, url:String, text: String)

val js = """ {
"crawlDate": "20150226",
"domain": "0x20.be",
"url": "http://0x20.be/smw/index.php?title=99_Bottles_of_Beer&oldid=6214",
"text": "99 Bottles of Beer From Whitespace (Hackerspace Gent) Revision as of 14:43, 8 August 2012 by Hans ( Talk | contribs ) 99 Bottles of Beer Where: Loading map... Just me, with 99 bottles of beer and some friends. Subpages"
}"""


parse(js).extract[ParsedPage]
10
dranxo

初めてこれにぶつかった人にとっては、 circe も良いオプションです

val customerJson = s"""{"id" : "1", "name" : "John Doe"}"""
case class Customer(id: String, name: String)
val customer = decode[Customer](customerJson)
1
Rjk

小さいのでspray-jsonを使用してください。

_import spray.json._
import DefaultJsonProtocol._


val json = """{"one" : "1", "two" : "2", "three" : "3"}""".parseJson

case class Numbers(one: String, two: String, three: String)

object MyJsonProtocol extends DefaultJsonProtocol {
  implicit val numbersFormat = jsonFormat3(Numbers)

}

import MyJsonProtocol._

val converted = json.convertTo[Numbers]
_

このbuild.sbtを使用してSpray-jsonをsbtにダウンロードします。

lazy val root = (project in file(".")). settings( name := "jsonExample", libraryDependencies += "io.spray" %% "spray-json" % "1.3.2" )

1
Walker Rowe

Net.liftwebを使用する

import net.liftweb.json._
case class Detail(username:String, password:String)
implicit val formats = DefaultFormats
val input = parse(jsonString).extract[Detail]
println(input.username)

Scalaバージョンがlift-json jarと一致することを確認してください。たとえば、Scala 2.10にはlift-json_2.10。を使用してください。

0
saket

スプレーJsonはかなり軽量で、まさに必要なことを行います。これは完全なフレームワークではなくツールキットであり、プロジェクト全体ではなくSpray-jsonプロジェクトをインポートするだけです。

https://github.com/spray/spray-json

これらの例により、非常に迅速にセットアップできます。ほとんどの場合、JSONとの間で変換するコードは1つのライナーになりますが、奇妙な要件がある場合には明示的に処理することができます。

0
Gangstead

次に、Play FrameworkでJSON変換を行います。

成熟したジャクソンも見てください。 Jackson Scala Module: https://github.com/FasterXML/jackson-module-scala を使用する必要があることに注意してください。

イントロを提供するまともな記事-暗黙的な変換を追加するコード: https://coderwall.com/p/o--apg/easy-json-un-marshalling-in-scala-with-jackson

0
Adrian