json - array - mongodb where nested
Cómo convertir Scala Map en JSON String? (5)
Por ejemplo, tengo este valor de mapa en Scala:
val m = Map(
"name" -> "john doe",
"age" -> 18,
"hasChild" -> true,
"childs" -> List(
Map("name" -> "dorothy", "age" -> 5, "hasChild" -> false),
Map("name" -> "bill", "age" -> 8, "hasChild" -> false)
)
)
Quiero convertirlo a su representación de cadena JSON:
{
"name": "john doe",
"age": 18,
"hasChild": true,
"childs": [
{
"name": "dorothy",
"age": 5,
"hasChild": false
},
{
"name": "bill",
"age": 8,
"hasChild": false
}
]
}
Actualmente estoy trabajando en Play Framework v2.3, pero la solución no necesita usar la biblioteca Play JSON, aunque sería bueno que alguien pudiera ofrecer tanto la solución Play como la que no.
Esto es lo que he hecho hasta ahora sin éxito:
// using jackson library
val mapper = new ObjectMapper()
val res = mapper.writeValueAsString(m)
println(res)
Resultado:
{"empty":false,"traversableAgain":true}
No entiendo por qué obtuve ese resultado.
Como una solución sin juego, puede considerar usar json4s, que proporciona una envoltura alrededor de jackson y es fácil de usar. Si está utilizando json4s, puede convertir el mapa en json simplemente usando:
write(m)
//> res0: String = {"name":"john doe","age":18,"hasChild":true,"childs":[{"name":"dorothy","age":5,"hasChild":false},{"name":"bill","age":8,"hasChild":false}]}
- Actualización para incluir el ejemplo completo--
import org.json4s._
import org.json4s.native.Serialization._
import org.json4s.native.Serialization
implicit val formats = Serialization.formats(NoTypeHints)
val m = Map(
"name" -> "john doe",
"age" -> 18,
"hasChild" -> true,
"childs" -> List(
Map("name" -> "dorothy", "age" -> 5, "hasChild" -> false),
Map("name" -> "bill", "age" -> 8, "hasChild" -> false)))
write(m)
Salida:
res0: String = {"name":"john doe","age":18,"hasChild":true,"childs":[{"name"
:"dorothy","age":5,"hasChild":false},{"name":"bill","age":8,"hasChild":false }]}
Forma alternativa:
import org.json4s.native.Json
import org.json4s.DefaultFormats
Json(DefaultFormats).write(m)
Debes decirle a jackson cómo tratar con objetos mapper.registerModule(DefaultScalaModule)
: mapper.registerModule(DefaultScalaModule)
Si está trabajando con un modelo de datos bien definido, ¿por qué no define las clases de casos y utiliza las macros de Play JSON para gestionar la conversión? es decir
case class Person(name: String, age: Int, hasChild: Boolean, childs: List[Person])
implicit val fmt = Json.format[Person]
val person = Person(...)
val jsonStr = Json.toJson(person)
Una cosa que puedes hacer usando la biblioteca Jackson es usar un objeto java HashMap, en lugar de un Scala uno. Entonces, básicamente puede usar el mismo código "sin éxito" que ya escribió.
import org.codehaus.jackson.map.ObjectMapper
val mapper = new ObjectMapper()
val jmap = new java.util.HashMap[String, Int]()
jmap.put("dog", 4)
jmap.put("cat", 1)
// convert to json formatted string
val jstring = mapper.writeValueAsString(jmap)
println(jstring)
devoluciones
jstring: String = {"dog":4,"cat":1}
val mapper = new ObjectMapper()
mapper.writeValueAsString(Map("a" -> 1))
resultado> {"vacío": falso, "traversableAgain": true}
===========================
import com.fasterxml.jackson.module.scala.DefaultScalaModule
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
mapper.writeValueAsString(Map("a" -> 1))
resultado> {"a": 1}