2015-10-23 20 views
6

Prima di tutto, ho cercato molto su Google e StackOverflow per domande del genere, ma non ho trovato nessuna risposta utile (con mia grande sorpresa).Come creare un oggetto JSON in Scala?

Ho visto qualcosa su Play Framework, how to create JSON array in Java e how to create JSON objects in Java, ma non voglio utilizzare Play Framework e non so se la creazione di oggetti JSON differisca da Scala in Java.

Di seguito è il JSON che voglio creare. Più tardi convertirò l'oggetto in una stringa per inviarlo tramite una richiesta POST (tramite una chiamata API).

{ 
    "start_relative": { 
     "value": "5", 
     "unit": "years" 
    }, 
    "metrics": [ 
     { 
     "name": "DP_391366" # S-Temperature - Celsius 
     }, 
     { 
      "name": "DP_812682" # Sensor-A4 Luminosity 
     } 
    ] 
} 

Come posso fare qualcosa del genere in Scala?

+0

Non è chiaro cosa stai chiedendo. Stai cercando di passare da una classe Scala a una stringa JSON? Puoi pubblicare la scala classe/pobject che stai cercando di convertire? – djechlin

+0

No, non voglio convertire una classe Scala in una stringa JSON. Voglio creare un JSON valido da Scala. – Paladini

+0

Cosa significa "da Scala"? – djechlin

risposta

6

È necessario utilizzare una libreria che gestisca la serializzazione/deserializzazione. Vorrei prendere in considerazione la scelta tra Spray Json e Play Json.

Vi spiegherò come funziona il processo con Riproduzione prima ed è molto simile a quello in Spray.

Diciamo che dispone di una classe, e un oggetto con un'istanza ed un JSON come stringa:

case class MyClass(id: Int, 
        name: String, 
        description: String) 

object Data { 
    val obj: MyClass = MyClass(1, "me", "awesome") 
    val str: String = 
     """ 
     |{ 
     | "id": 1, 
     | "name": "me", 
     | "description": "awesome" 
     |} 
     """.stripMargin 
} 

Per MyClass essere serializzato/deserializzata, avrete bisogno di un formattatore implicita, specifico per questo, in modo creerai un oggetto che contiene questo formattatore utilizzando Riproduci.

trait MyClassPlayProtocol { 
    implicit val formatAbility = Json.format[Ability] 
} 
object MyClassPlayProtocol extends MyClassPlayProtocol 

La serializzazione/deserializzazione sarà simile a questo:

object PlayData { 

    import play.api.libs.json.JsValue 
    import play.api.libs.json.Json 
    import MyClassPlayProtocol._ 
    import General._ 

    val str2Json: JsValue = Json.parse(str) 
    val obj2Json: JsValue = Json.toJson(obj) 

    val json2Str: String = Json.stringify(str2Json) 
    val json2Obj: MyClass = obj2Json.as[MyClass] 
} 

In Spray, il protocollo sarà simile a questa:

trait MyClassSprayProtocol extends DefaultJsonProtocol { 
    implicit val myClassFormat = jsonFormat3(MyClass) 
} 
object MyClassSprayProtocol extends MyClassSprayProtocol 

e la serializzazione/deserializzazione:

object SprayData { 

    import spray.json._ 
    import MyClassSprayProtocol._ 
    import General._ 

    val str2Json: JsValue = str.parseJson 
    val obj2Json: JsValue = obj.toJson 

    val json2Str: String = str2Json.compactPrint 
    val json2Obj: MyClass = obj2Json.convertTo[MyClass] 
} 

Come potete vedere, è principalmente una questione di scelta tra questi due. Entrambi sono ancora migliorati e probabilmente lo saranno nel prossimo futuro.

A seconda del benchmark, troverete che uno è migliore rispetto all'altro di pochi millisecondi (di solito Spray).

Io per primo sono utilizzando Spray al lavoro e Gioca in alcuni progetti personali, e non posso dire che ho trovato qualcosa di fondamentalmente diverso da uno all'altro.

EDIT:

E per rispondere finalmente alla tua domanda, per andare MyClass-String (serializzazione), si farà qualcosa di simile:

PLAY: Json.stringify(Json.toJson(myClass)) 
SPRAY: myClass.toJson.compactPrint 

E la deserializzazione:

PLAY: Json.parse(string).as[MyClass] 
SPRAY: myClass.parseJson.convertTo[MyClass] 
3

è necessario utilizzare una libreria se non volete che faccia da soli ci sono serveral:

Nota: Il fresco Java GSON LIbrary perde un sacco di magia, se si desidera utilizzarlo con Scala, perché non sanno Collezioni. Quindi se vuoi usare questa libreria devi convertire la "Lista Scala" in java.util.List e successivamente usare Gson.

+1

Puoi anche usare Jackson con il [modulo Scala] (https://github.com/FasterXML/jackson-module-scala). – 2rs2ts