Как мне записывать/читать на/с диска объект Spray json?

Я хочу иметь возможность читать/записывать объект 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
  }
}


person bashan    schedule 29.11.2014    source источник
comment
Ваш код не компилируется. Что за x в последней строке? вы пытаетесь write или read JSON?   -  person Soumya Simanta    schedule 30.11.2014
comment
Извините, Сумья, смысл был таков: foo.toJson. Во всяком случае, это сработало: x.toJson.toString()   -  person bashan    schedule 01.12.2014


Ответы (1)


О, это разочаровывает. Я добавил диаграмму в информацию о spray-json, которая, как я надеялся, будет полезна новичкам. Но вам все еще нужно выяснить, что делать с имплицитами.

Spray-json использует классы типов для сериализации/десериализации объектов. Возможно, вы захотите прочитать о классах типов, но здесь важно знать, что неявные объекты JsonFormat должны находиться в области действия для всех классов, используемых объектом, и вещей, на которые он ссылается. Черта DefaultJsonProtocol содержит неявные форматы JsonFormat для распространенных типов Scala, и вы должны предоставить собственные неявные форматы JsonFormat для своих типов. Методы jsonFormat1,2,... обеспечивают простой способ создания таких форматов JsonFormat для классов случаев.

Есть ряд проблем с вашей программой. Вот простой, который работает:

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
}
person AmigoNico    schedule 30.11.2014
comment
Спасибо АмигоНико. Ридми выглядит ОТЛИЧНО. Я просто не видел. Это как-то теряется со всеми файлами... :) - person bashan; 01.12.2014
comment
Ваши исправления также выглядят ВЕЛИКОЛЕПНО. Спасибо :) - person bashan; 01.12.2014
comment
Рад, что помог, Башан. Удачи. - person AmigoNico; 01.12.2014
comment
Я скептически отношусь к тому, почему файловый ввод-вывод не считается основным требованием в spray-json, и нам приходится прибегать к BufferedWriter? Более того, ваш код не компилируется. - person Arunav Sanyal; 11.12.2016
comment
@Arunav: Вместо того, чтобы иметь библиотеку сериализации/десериализации JSON, сложную математическую библиотеку, библиотеку обработки сигналов и сотни других, каждая из них выполняет файловый ввод-вывод на случай, если вы хотите сохранить результат в файл, каждая со своим собственным API , не лучше ли было бы, чтобы у каждого была Единственная ответственность, и вы использовали свой собственный небольшой метод для сброса строки в файл? - person AmigoNico; 12.12.2016
comment
@Arunav: Что касается (недружелюбного?) Кроме того, ваш код не компилирует комментарий, я только что перепроверил его; у меня он отлично работает/собирается со Scala 2.12.0 и spray-json 1.3.2. Если вам нужна помощь, почему бы не создать новый вопрос со ссылкой на этот и предоставить информацию, которая понадобится людям, чтобы помочь вам? - person AmigoNico; 12.12.2016