Scala 2.10 + Json serialization and deserialization

后端 未结 5 475
生来不讨喜
生来不讨喜 2020-12-04 14:28

Scala 2.10 seems to have broken some of the old libraries (at least for the time being) like Jerkson and lift-json.

The target usability is as follows:

<         


        
5条回答
  •  感动是毒
    2020-12-04 15:11

    I can heartily recommend argonaut for json support in scala. All you need to configure it to serialize your Customer object is one line:

    implicit lazy val CodecCustomer: CodecJson[Customer] =
    casecodec6(Customer.apply, Customer.unapply)("id","name","address","city","state","user_id")
    

    That will pimp your class to give it an .asJson method which turns it into a string. It will also pimp the string class to give it a method .decodeOption[List[Customer]] to parse strings. It handles the options in your class fine. Here is a working class with a passing test and a running main method which you can drop into a git clone of argonaut to see it all working fine:

    package argonaut.example
    
    import org.specs2.{ScalaCheck, Specification}
    import argonaut.CodecJson
    import argonaut.Argonaut._
    
    case class Customer(id: Int, name: String, address: Option[String],
                        city: Option[String], state: Option[String], user_id: Int)
    
    class CustomerExample extends Specification with ScalaCheck {
    
      import CustomerExample.CodecCustomer
      import CustomerExample.customers
    
      def is = "Stackoverflow question 12591457 example" ^
        "round trip customers to and from json strings " ! {
          customers.asJson.as[List[Customer]].toOption must beSome(customers)
        }
    }
    
    object CustomerExample {
    
      implicit lazy val CodecCustomer: CodecJson[Customer] =
        casecodec6(Customer.apply, Customer.unapply)("id","name","address","city","state","user_id")
    
      val customers = List(
        Customer(1,"one",Some("one street"),Some("one city"),Some("one state"),1)
        , Customer(2,"two",None,Some("two city"),Some("two state"),2)
        , Customer(3,"three",Some("three address"),None,Some("three state"),3)
        , Customer(4,"four",Some("four address"),Some("four city"),None,4)
      )
    
      def main(args: Array[String]): Unit = {
    
        println(s"Customers converted into json string:\n ${customers.asJson}")
    
        val jsonString =
          """[
            |   {"city":"one city","name":"one","state":"one state","user_id":1,"id":1,"address":"one street"}
            |   ,{"city":"two city","name":"two","state":"two state","user_id":2,"id":2}
            |   ,{"name":"three","state":"three state","user_id":3,"id":3,"address":"three address"}
            |   ,{"city":"four city","name":"four","user_id":4,"id":4,"address":"four address"}
            |]""".stripMargin
    
    
        var parsed: Option[List[Customer]] = jsonString.decodeOption[List[Customer]]
    
        println(s"Json string turned back into customers:\n ${parsed.get}")
    
      }
    }
    

    The developers are also helpful and responsive to folks getting started.

提交回复
热议问题