29 votes

Comment sérialisez-vous une carte en JSON en Scala ?

Alors j'ai une Map en Scala comme ceci :

val m = Map[String, String](
    "a" -> "theA",
    "b" -> "theB",
    "c" -> "theC",
    "d" -> "theD",
    "e" -> "theE"
)

et je veux sérialiser cette structure dans une chaîne JSON en utilisant lift-json.

Est-ce que l'un d'entre vous sait comment faire cela ?

1voto

jwhitlark Points 475

Similaire à la solution d'Einar, vous pouvez utiliser JSONObject de Parser Combinators pour ce faire. Notez qu'il ne se récurs pas, vous devrez le faire vous-même. La bibliothèque inclut également JSONArray, pour des structures de données de type liste. Quelque chose comme ce qui suit abordera les préoccupations de Noel concernant les structures imbriquées. Cet exemple ne se récurs pas jusqu'à un niveau arbitraire, mais gérera une valeur de List[Map[String, Any]].

import scala.util.parsing.json.{JSONArray, JSONObject}

def toJson(m : Map[String, Any]): String = JSONObject(
  m.mapValues {
    case mp: Map[String, Any] => JSONObject(mp)
    case lm: List[Map[String, Any]] => JSONArray(lm.map(JSONObject(_)))
    case x => x
    }
  ).toString

0voto

Junji Shimagaki Points 127

Complétant la réponse de @Raja.

Pour ces objets imbriqués, je modifie localement la classe pour avoir mon toString() souhaité de cette manière:

case class MList[T]() extends MutableList[T] { override def toString() = "[" + this.toList.mkString(",") + "]" }

Ensuite, à l'intérieur de l'objet Map, j'utilise ce MList à la place de la List standard. De cette façon, mon objet map s'affiche correctement en appelant JSONObject(map).toString().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X