Chcem byť schopný čítať / zapisovať objekt Json z / na disk.
Pripúšťam, že v Jave by to bolo asi desať minút.
Scala je trochu náročnejšia. Myslím, že hlavným dôvodom nie je dostatok informácií na internete.
Mimochodom, toto som urobil zatiaľ:
package com.example
import java.io.{BufferedWriter, FileWriter}
import spray.json._
import spray.json.DefaultJsonProtocol
import java.nio.file.{Paths, Files}
import java.nio.charset.StandardCharsets
object Test {
object Foo extends DefaultJsonProtocol {
implicit val fooFormat = jsonFormat2(Foo.apply)
}
case class Foo(name: String, x: String) {
//def toJson:JsValue = JsObject( "name" -> JsString(name) )
}
def main(args: Array[String]) {
println("Hello, world!")
implicit val foo = new Foo("xxx", "jj")
println(foo.toJson)
val w = new BufferedWriter(new FileWriter("output.txt"))
w.write(x.toJson) // This doesn"t work. I also tried: x.toJson.toString
}
}
odpovede:
1 pre odpoveď č. 1Aw, to je sklamanie. Prispel som do diagramu Spray-json readme že som dúfala, že bude užitočná pre začínajúcich. Ale stále musíte zistiť, čo robiť s implicitnými.
Spray-json používa typové triedy naserializovať / deserializovať objekty. Možno budete chcieť prečítať o typových triedach, ale dôležité je vedieť, že implicitné objekty JsonFormat musia byť v rozsahu pre všetky triedy používané objektom a veci, ktoré odkazuje. Štandard DefaultJsonProtocol obsahuje implicitné JsonFormats pre bežné typy Scala a musíte poskytnúť svoje vlastné implicitné JsonFormats pre svoje vlastné typy. Metódy jsonFormat1,2, ... poskytujú jednoduchý spôsob vytvorenia takýchto JsonFormats pre triedy prípadov.
Existuje niekoľko problémov s vaším programom. Tu je jednoduchý, ktorý funguje:
import spray.json._
import java.io.{BufferedWriter, FileWriter}
object Test extends App with DefaultJsonProtocol {
case class Foo(name: String, x: String)
implicit val fooFormat = jsonFormat2(Foo.apply)
val foo = Foo("xxx", "jj")
println(foo.toJson)
val w = new BufferedWriter(new FileWriter("output.txt"))
w.write(foo.toJson.prettyPrint)
w.close
}