¿Qué biblioteca JSON usar en Scala? [cerrado]
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?
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:
- parsing.json.JSON : advertencia, esta biblioteca solo está disponible hasta la versión 2.9.x de Scala (eliminada en versiones más recientes)
- spray-json - Extraído del proyecto Spray
- 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.
- sjson - Por Debasish Ghosh
- lift-json : se puede utilizar por separado del proyecto Lift
- 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
- Argonaut 💣 § - Una biblioteca JSON orientada a FP para Scala, de la gente detrás de Scalaz
- play-json ±: ahora disponible de forma independiente, consulte esta respuesta para obtener más detalles
- dijon : una biblioteca JSON práctica, segura y eficiente que utiliza jsoniter-scala en su interior.
- sonofjson : biblioteca JSON destinada a una API súper simple
- Jawn : biblioteca JSON de Erik Osheim que apunta a una velocidad de Jackson o más rápida
- Rapture JSON ±: un front-end JSON que puede usar 2, 4, 5, 6, 7, 11 o Jackson como back-end
- circe 💣 - tenedor de Argonaut construido sobre gatos en lugar de scalaz
- jsoniter-scala : macros de Scala para la generación en tiempo de compilación de códecs JSON ultrarrápidos
- jackson-module-scala : módulo complementario para que Jackson admita tipos de datos específicos de Scala
- 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.
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 scalaVersion
y 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.
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
}
}
}
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.