variable una tipo serializar recorrer que objeto leer ejecutar deserializar desde como cadena json scala scala-2.10 lift-json

una - Serialización y deserialización de Scala 2.10+Json



serializar y deserializar json c# (5)

Ahora hay un tenedor de Jerkson que admite Scala 2.10 en https://github.com/randhindi/jerkson .

Scala 2.10 parece haber roto algunas de las bibliotecas antiguas (al menos por el momento) como Jerkson y lift-json.

La usabilidad del objetivo es la siguiente:

case class Person(name: String, height: String, attributes: Map[String, String], friends: List[String]) //to serialize val person = Person("Name", ....) val json = serialize(person) //to deserialize val sameperson = deserialize[Person](json)

Pero estoy teniendo problemas para encontrar buenas formas existentes de generar y deserializar Json que funcionen con Scala 2.10.

¿Hay formas de mejores prácticas para hacer esto en Scala 2.10?


Entonces, basado en la ausencia de un mensaje de error y el código de muestra incorrecto, sospecho que esto es más un problema de simplemente no entender cómo funciona la extracción de lift-json. Si he entendido mal, comenta y avísame. Entonces, si estoy en lo cierto, esto es lo que necesitas.

Para serializar:

import net.liftweb.json._ import Extraction._ implicit val formats = DefaultFormats case class Person(...) val person = Person(...) val personJson = decompose(person) // Results in a JValue

Luego, para invertir el proceso, harías algo como:

// Person Json is a JValue here. personJson.extract[Person]

Si esa no es la parte con la que estás teniendo problemas, házmelo saber y puedo tratar de revisar mi respuesta para ser más útil.


Mencionando json4s que envuelve a jackson, lift-json o su propia implementación nativa como una solución a largo plazo:


Puedo recomendar encarecidamente argonaut para apoyo json en Scala. Todo lo que necesita para configurarlo para serializar su objeto Cliente es una línea:

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

Eso dominará a tu clase para darle un método .asJson que lo convierta en una cadena. También introducirá la clase de cadena para darle un método .decodeOption[List[Customer]] para analizar las cadenas. Maneja bien las opciones en su clase. Aquí hay una clase trabajadora con una prueba de aprobación y un método principal en ejecución que puedes colocar en un clon git de argonauta para ver si todo funciona bien:

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 = " 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}") } }

Los desarrolladores también son útiles y receptivos con la gente que está comenzando.


Jackson es una biblioteca de Java para procesar JSON rápidamente. El proyecto de Jerkson envuelve a Jackson, pero parece estar abandonado. Cambié al Módulo Scala de Jackson para serialización y deserialización a estructuras de datos nativas de Scala.

Para obtenerlo, incluye lo siguiente en tu build.sbt :

libraryDependencies ++= Seq( "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.1.3", ... )

Entonces sus ejemplos funcionarán literalmente con el siguiente envoltorio de Jackson (lo extraje de los archivos de prueba de jackson-module-scala):

import java.lang.reflect.{Type, ParameterizedType} import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.scala.DefaultScalaModule import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.`type`.TypeReference; object JacksonWrapper { val mapper = new ObjectMapper() mapper.registerModule(DefaultScalaModule) def serialize(value: Any): String = { import java.io.StringWriter val writer = new StringWriter() mapper.writeValue(writer, value) writer.toString } def deserialize[T: Manifest](value: String) : T = mapper.readValue(value, typeReference[T]) private [this] def typeReference[T: Manifest] = new TypeReference[T] { override def getType = typeFromManifest(manifest[T]) } private [this] def typeFromManifest(m: Manifest[_]): Type = { if (m.typeArguments.isEmpty) { m.erasure } else new ParameterizedType { def getRawType = m.erasure def getActualTypeArguments = m.typeArguments.map(typeFromManifest).toArray def getOwnerType = null } } }

Otras opciones de Scala 2.10 JSON incluyen el scala-json Twitter basado en el libro Programming Scala: es simple, a costa del rendimiento. También hay spray-json , que usa parboiled para analizar. Finalmente, el manejo JSON de Play se ve bien, pero no se desacopla fácilmente del proyecto Play.