web-dev-qa-db-fra.com

Comment puis-je convertir une chaîne json sur une carte scala?

J'ai un JSON imbriqué dont la structure n'est pas définie. Cela peut être différent à chaque fois que je cours car je lis depuis un fichier distant. J'ai besoin de convertir ce JSON en une carte de type Map[String, Any]. J'ai essayé de regarder dans json4s et les analyseurs syntaxiques jackson mais ils ne semblent pas résoudre ce problème que j'ai. Est-ce que quelqu'un sait comment je peux y arriver?

Exemple de chaîne:

{"body":{
    "method":"string",
    "events":"string",
    "clients":"string",
    "parameter":"string",
    "channel":"string",
    "metadata":{
        "meta1":"string",
        "meta2":"string",
        "meta3":"string"
    }
},
"timestamp":"string"}

Le niveau d'imbrication peut être arbitraire et non prédéfini.
Pour vous aider avec le cas d'utilisation:
J'ai une carte [String, Any] à sauvegarder dans un fichier. Je le convertis donc en chaîne json et le stocke dans un fichier. Maintenant, chaque fois que je reçois de nouvelles données, je dois extraire le fichier JSON du fichier, le convertir à nouveau en carte et effectuer des calculs. Je ne peux pas stocker la carte en mémoire car je la perdrais si mon travail échouait.
J'ai besoin d’une solution qui reconvertirait la chaîne json en une carte originale avant de la convertir.

7
Udit Mehta

J'ai essayé la méthode suivante avec json4s 3.2.11 et cela fonctionne:

import org.json4s._
import org.json4s.jackson.JsonMethods._

//...
def jsonStrToMap(jsonStr: String): Map[String, Any] = {
  implicit val formats = org.json4s.DefaultFormats

  parse(jsonStr).extract[Map[String, Any]]
}

Peut-être n'avez-vous pas défini le implicit val de type Formats? Notez également que vous n'avez pas besoin d'avoir un implicit val dans chaque méthode tant qu'il est findable dans l'étendue.

10
lambdista

Vous pouvez utiliser le code suivant pour analyser une chaîne JSON dans un Map[String, Any]

val jsonMap = parse(jsonString).values.asInstanceOf[Map[String, Any]]

Cependant, il s'agit de not typesafe et doit donc être utilisé avec prudence lors de l'extraction de valeurs de la carte.

2
user297112