Ich extrahiere derzeit einige Metriken aus verschiedenen Datenquellen und speichert sie in einer Zuordnung des Typs Map[String,Any]
, wobei der Schlüssel dem Metriknamen entspricht und der Wert dem Metrikwert entspricht . Ich brauche das mehr oder weniger generisch, was bedeutet, dass Werttypen primitive Typen oder Listen primitiver Typen sein können.Zuordnung [Zeichenfolge, Beliebige] zu komprimieren JSON-Zeichenfolge mit JSON
Ich möchte diese Karte zu einer JSON-formatierten Zeichenfolge serialisieren und dafür verwende ich json4s
Bibliothek. Die Sache ist, dass es nicht möglich scheint und ich sehe keine mögliche Lösung dafür. Ich würde so etwas wie die folgende erwarten aus dem Kasten heraus zu arbeiten :)
val myMap: Map[String,Any] = ... // extract metrics
val json = myMap.reduceLeft(_ ~ _) // create JSON of metrics
Navigation durch source code I json4s
bietet implizite Konvertierungen, um primitive Typen JValue
‚s zu verwandeln gesehen habe und auch Traversable[A]/Map[String,A]/Option[A]
-JValue
zu konvertieren (unter der Einschränkung, eine implizite Umwandlung von A
zu JValue
verfügbar zu sein, was ich verstehe, bedeutet es eigentlich A
ist ein primitiver Typ). Der Operator ~
bietet eine gute Möglichkeit, JObject
's aus JField
' s zu konstruieren, was nur ein Typalias für (String, JValue)
ist.
In diesem Fall ist Kartenwert Typ Any
, so implizite Konvertierungen nicht stattfinden und damit der Compiler wirft der folgende Fehler:
value ~ is not a member of (String, Any)
[error] val json = r.reduceLeft(_ ~ _)
Gibt es eine Lösung für das, was ich erreichen will?
Wenn ich Sie richtig verstehe und Sie möchten nur 'myMap' serialisieren, warum nicht' Serialization.write (myMap) 'direkt nennen? – edi
@ user3567830 Ich möchte eine JSON-String-Repräsentation von 'myMap', das ist der Zweck der Verwendung einer JSON-Scala-Bibliothek wie' json4s' – jarandaf
Ja, 'org.json4s.jackson.Serialization.write (myMap)' tut genau das. (Ich habe die jackson Version von json4s benutzt, aber das sollte auch für die native Version funktionieren). – edi