我希望能够从/向磁盘读取/写入Json对象。
我承认,在Java中我花了大约10分钟。
Scala更具挑战性。我认为主要原因是网上信息不足。
无论如何,这是我到目前为止所做的:
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
}
}
答案 0 :(得分:1)
噢,那令人失望。我为spray-json readme提供了一个图表,希望对新手有所帮助。但是你仍然需要弄清楚如何处理暗示。
Spray-json使用类型类来序列化/反序列化对象。您可能希望阅读类型类,但重要的是要知道隐式JsonFormat对象必须在对象使用的所有类及其引用的内容的范围内。 DefaultJsonProtocol特性包含常见Scala类型的隐式JsonFormats,您必须为自己的类型提供自己的隐式JsonFormats。 jsonFormat1,2,...方法提供了一种为case类创建这样的JsonFormats的简单方法。
您的计划存在许多问题。这是一个有效的简单方法:
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
}