¿Qué biblioteca JSON usar en Scala? [cerrado]

Resuelto David Portabella asked hace 13 años • 15 respuestas

Necesito construir una cadena JSON, algo como esto:

[
  { 'id': 1, 'name': 'John'},
  { 'id': 2, 'name': 'Dani'}
]

val jArray = JsArray();
jArray += (("id", "1"), ("name", "John"))
jArray += (("id", "2"), ("name", "Dani"))
println(jArray.dump)

Necesito poder agregar filas a jArray, algo comojArray += ...

¿Cuál es la biblioteca/solución más cercana a esto?

David Portabella avatar Nov 08 '11 23:11 David Portabella
Aceptado

Desafortunadamente, escribir una biblioteca JSON es la versión de la comunidad Scala de codificar una aplicación de lista de tareas pendientes.

Hay bastante variedad de alternativas. Los enumero sin ningún orden en particular, con notas:

  1. parsing.json.JSON : advertencia, esta biblioteca solo está disponible hasta la versión 2.9.x de Scala (eliminada en versiones más recientes)
  2. spray-json - Extraído del proyecto Spray
  3. Jerkson ±: advertencia sobre una buena biblioteca (construida sobre Java Jackson) pero ahora abandona el software. Si va a utilizar esto, probablemente siga el ejemplo del proyecto Scalding y utilice la bifurcación backchat.io.
  4. sjson - Por Debasish Ghosh
  5. lift-json : se puede utilizar por separado del proyecto Lift
  6. json4s 💣 § ± - Una extracción de lift-json, que intenta crear un JSON AST estándar que otras bibliotecas JSON pueden usar. Incluye una implementación respaldada por Jackson
  7. Argonaut 💣 § - Una biblioteca JSON orientada a FP para Scala, de la gente detrás de Scalaz
  8. play-json ±: ahora disponible de forma independiente, consulte esta respuesta para obtener más detalles
  9. dijon : una biblioteca JSON práctica, segura y eficiente que utiliza jsoniter-scala en su interior.
  10. sonofjson : biblioteca JSON destinada a una API súper simple
  11. Jawn : biblioteca JSON de Erik Osheim que apunta a una velocidad de Jackson o más rápida
  12. Rapture JSON ±: un front-end JSON que puede usar 2, 4, 5, 6, 7, 11 o Jackson como back-end
  13. circe 💣 - tenedor de Argonaut construido sobre gatos en lugar de scalaz
  14. jsoniter-scala : macros de Scala para la generación en tiempo de compilación de códecs JSON ultrarrápidos
  15. jackson-module-scala : módulo complementario para que Jackson admita tipos de datos específicos de Scala
  16. borer - (des)serialización eficiente de CBOR y JSON en Scala

💣 = no ha solucionado vulnerabilidades de seguridad, § = tiene integración con Scalaz, ± = admite la interoperabilidad con JacksonJsonNode

En Snowplow usamos json4s con el back-end de Jackson; También hemos tenido buenas experiencias con Argonaut.

Alex Dean avatar Jan 21 '2013 16:01 Alex Dean

Lift-json está en la versión 2.6 y funciona muy bien (y también tiene muy buen soporte, el mantenedor siempre está listo para corregir cualquier error que los usuarios puedan encontrar. Puede encontrar ejemplos de su uso en el repositorio de github

Siempre se puede localizar al mantenedor (Joni Freeman) en la lista de correo de Lift . También hay otros usuarios en la lista de correo que también son de gran ayuda.

Como señala @Alexey, si desea utilizar la biblioteca con otra versión de Scala, diga 2.11.x, cámbiela scalaVersiony utilícela %%de la siguiente manera:

scalaVersion := "2.11.5" 

"net.liftweb" %% "lift-json" % "2.6"

Puede consultar el sitio liftweb.net para conocer la última versión a medida que pasa el tiempo.

fmpwizard avatar Nov 08 '2011 17:11 fmpwizard

El número 7 en la lista es Jackson, sin utilizar Jerkson. Tiene soporte para objetos Scala (clases de casos, etc.).

A continuación se muestra un ejemplo de cómo lo uso.

object MyJacksonMapper extends JacksonMapper
val jsonString = MyJacksonMapper.serializeJson(myObject)
val myNewObject = MyJacksonMapper.deserializeJson[MyCaseClass](jsonString)

Esto lo hace muy simple. Además, XmlSerializer y la compatibilidad con anotaciones JAXB son muy útiles.

Esta publicación de blog describe su uso con anotaciones JAXB y Play Framework.

http://krasserm.blogspot.co.uk/2012/02/using-jaxb-for-xml-and-json-apis-in.html

Aquí está mi JacksonMapper actual.

trait JacksonMapper {

  def jsonSerializer = {
    val m = new ObjectMapper()
    m.registerModule(DefaultScalaModule)
    m
  }

  def xmlSerializer = {
    val m = new XmlMapper()
    m.registerModule(DefaultScalaModule)
    m
  }

  def deserializeJson[T: Manifest](value: String): T = jsonSerializer.readValue(value, typeReference[T])
  def serializeJson(value: Any) = jsonSerializer.writerWithDefaultPrettyPrinter().writeValueAsString(value)
  def deserializeXml[T: Manifest](value: String): T = xmlSerializer.readValue(value, typeReference[T])
  def serializeXml(value: Any) = xmlSerializer.writeValueAsString(value)

  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
     }
  }
}   
Ramon avatar Apr 02 '2013 06:04 Ramon

Tal vez llegué un poco tarde, pero realmente deberías intentar usar la biblioteca json del marco de juego. Podrías mirar la documentación . En la versión actual 2.1.1 no se podía utilizar por separado sin el juego completo 2, por lo que la dependencia se verá así:

val typesaferepo  = "TypeSafe Repo" at "http://repo.typesafe.com/typesafe/releases"
val play2 = "play" %% "play" % "2.1.1"

Te brindará un marco de juego completo con todo el material a bordo.

Pero como sé, los chicos de Typesafe tienen un plan para separarlo en la versión 2.2. Entonces, hay play-json independiente de 2.2-snapshot.

Alex Povar avatar Jun 21 '2013 05:06 Alex Povar