2015-04-28 4 views
6

Ich habe einen verschachtelten JSON, dessen Struktur nicht definiert ist. Es kann jedes Mal anders sein, wenn ich laufe, seit ich von einer entfernten Datei lese. Ich muss diese JSON in eine Karte des Typs Map[String, Any] konvertieren. Ich habe versucht, in json4s und jackson Parser zu suchen, aber sie scheinen dieses Problem, das ich habe, nicht zu lösen. Weiß jemand wie ich das erreichen kann?Wie kann ich eine JSON-Zeichenfolge in eine Scala-Map konvertieren?

Beispiel string:

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

Das Niveau der Verschachtelung kann beliebig und nicht vorgegeben werden.
Um mit dem Anwendungsfall zu helfen:
Ich habe eine Karte [String, Any], die ich in einer Datei als Sicherung speichern muss. Also konvertiere ich es in eine JSON-Zeichenkette und speichere es in einer Datei. Jetzt, jedes Mal, wenn ich neue Daten bekomme, muss ich den JSON aus der Datei holen, wieder in eine Map konvertieren und etwas rechnen. Ich kann die Karte nicht speichern, da ich sie verlieren würde, wenn mein Job fehlschlägt.
Ich brauche eine Lösung, die die JSON-Zeichenfolge zurück in die ursprüngliche Karte konvertieren würde, die ich hatte, bevor ich es konvertiert habe.

+0

Warum verwenden Sie JSON.parseRaw nicht? – turutosiya

+0

Können Sie ein Beispiel für den JSON und anderen hilfreichen Code veröffentlichen? oder Infos? –

+0

Wie können Sie 'Any' serialisieren? –

Antwort

6

habe ich versucht, die folgende Methode mit json4s 3.2.11 und es funktioniert:

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]] 
} 

Vielleicht haben Sie die implicit val von Formats Typ nicht definieren? Beachten Sie auch, dass Sie nicht innerhalb jeder Methode eine implicit val haben müssen, solange sie im Bereich zu finden ist.

+0

Hey @lambdista, der Code sieht perfekt aus. und ich möchte dies als eine benutzerdefinierte Funktion in Spark implementieren, aber Funken Daten Frames unterstützt "keine" Ref und ich versuchte das gleiche mit String, String, aber es scheint nicht zu funktionieren. Haben Sie eine Idee, wie können wir typspezifisch machen? Vielen Dank – GSR

1

Sie können den folgenden Code verwenden, um einen JSON-String in ein Jedoch Map[String, Any]

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

zu analysieren, ist dies nicht typsicher und daher mit Vorsicht verwendet werden soll, wenn die Werte aus der Karte zu extrahieren.

Verwandte Themen