wake-up-neo.com

Scala: Analysiert JSON direkt in eine Fallklasse

Wie lässt sich JSON bei einer gegebenen JSON-Zeichenfolge und einer entsprechenden Case-Klasse auf einfache Weise in die Case-Klasse zerlegen? Es gibt viele Bibliotheken zur Verfügung, aber es scheint, dass Scala dies jetzt sofort tun könnte.

Was ist, wenn der JSON in eine Liste der case-Klasse geparst werden soll?

AKTUALISIEREN:

Jerkson scheint verlassen zu sein, und ich möchte nicht das gesamte Play- oder Lift-Framework oder etwas anderes Schweres installieren.

34
SRobertJames

Es gibt mehrere Frameworks, die genau das können.

circe

Heutzutage viel benutzt. Viele tolle Funktionen. Zieht Katzen herein.

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

JSON4s

JSON4s ist ausgereift und unterstützt jackson oder einen native JSON-Parser. Verwendet es in vielen Projekten, um Jerkson zu ersetzen.

https://github.com/json4s/json4s

play-json

Kann ohne den vollen Spielstapel verwendet werden. Tolle Unterstützung im Rahmen des Spielprojekts bei typesafe.

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

Scala-Beizen

Ein Serialisierungs-Framework. Es gibt eine Option zum Serialisieren/und Deserialisieren in JSON.

https://github.com/scala/pickling

JSON sprühen

Kann searialisieren und deserialisieren. Notwendigkeit, die Anzahl der Argumente für die Deserialisierung zu kennen.

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

19
Andreas Neumann

Ich habe https://github.com/json4s/json4s verwendet, bisher ist nur meckern 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

Für alle, die zum ersten Mal damit in Berührung kommen, ist circe ebenfalls eine gute Option

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

Verwenden Sie Spray-Json, da es klein ist.

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]

Lade spray-json mit diesem build.sbt in sbt herunter:

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

1
Walker Rowe

Verwenden Sie 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)

Stellen Sie sicher, dass die Scala Version mit dem lift-json Jar übereinstimmt. Verwenden Sie zum Beispiel Scala 2.10 lift-json_2.10.

0
saket

Spray Json ist ziemlich leicht und macht genau das, was Sie brauchen. Es ist ein Toolkit anstelle eines vollständigen Frameworks und Sie können einfach das Spray-json-Projekt anstelle des gesamten Projekts importieren.

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

Mit den Beispielen können Sie sich sehr schnell einrichten. Die meiste Zeit besteht Ihr Code für die Übersetzung in/aus JSON aus einer Zeile, aber Sie haben die Möglichkeit, ihn explizit zu verarbeiten, falls Sie komische Anforderungen haben.

0
Gangstead

Ich unterstütze die JSON-Konvertierung im Play Framework.

Schauen Sie sich auch Jackson an, der ausgereift ist. Beachten Sie, dass Sie Jackson Scala Module: https://github.com/FasterXML/jackson-module-scala verwenden müssen.

Ein anständiger Artikel mit einer Einführung - dann ein bisschen Code zum Hinzufügen impliziter Konvertierungen: https://coderwall.com/p/o--apg/easy-json-un-marshalling-in-scala-with-jackson

0
Adrian