alchemist
alchemist

Reputation: 41

Is it possible to serialize non case classes in Scala?

Is it possible to serialize object of below class using Json4s or lift or any other library?

class User(uId: Int) extends Serializable {
  var id: Int = uId
  var active: Boolean = false
  var numTweets: Int = 0
  var followers: ArrayBuffer[Int] = null
  var following: ArrayBuffer[Int] = null
  var userTimeline: Queue[String] = null
  var homeTimeline: Queue[String] = null
  var userTimelineSize: Int = 0
  var homeTimelineSize: Int = 0
  //var notifications: Queue[String] = null
  var mentions: Queue[String] = null
  var directMessages: Queue[String] = null
}

Upvotes: 3

Views: 1053

Answers (1)

nitishagar
nitishagar

Reputation: 9403

You can use Json4s for this purpose (with help of FieldSerializer), below is the code to get started with serialization of the User object:

def main(args: Array[String]) {
    import org.json4s._
    import org.json4s.native.Serialization
    import org.json4s.native.Serialization.{read, write, writePretty}

    implicit val formats = DefaultFormats + FieldSerializer[User]()

    val user = new User(12)

    val json = write(user)
    println(writePretty(user))
}

Also, in your non case class anything which is missing from the JSON needs to be an Option.

Another method would be to go for Genson:

def main(args: Array[String]) {
    import com.owlike.genson._
    import com.owlike.genson.ext.json4s._
    import org.json4s._
    import org.json4s.JsonDSL._
    import org.json4s.JsonAST._

    object CustomGenson {
      val genson = new ScalaGenson(
        new GensonBuilder()
        .withBundle(ScalaBundle(), Json4SBundle())
        .create()
      )
    }

    // then just import it in the places you want to use this instance instead of the default one
    import CustomGenson.genson._

    val user = new User(12)    

    val jsonArray = toJson(user)
    println(jsonArray)
}

Upvotes: 4

Related Questions