I am currently extracting some metrics from different data sources and storing them in a map of type Map[String,Any]
where the key corresponds to the metric name and the value corresponds to the metric value. I need this to be more or less generic, which means that values types can be primitive types or lists of primitive types.
I would like to serialize this map to a JSON-formatted string and for that I am using json4s
library. The thing is that it does not seem possible and I don't see a possible solution for that. I would expect something like the following to work out of the box :)
val myMap: Map[String,Any] = ... // extract metrics
val json = myMap.reduceLeft(_ ~ _) // create JSON of metrics
Navigating through source code I've seen json4s
provides implicit conversions in order to transform primitive types to JValue
's and also to convert Traversable[A]/Map[String,A]/Option[A]
to JValue
's (under the restriction of being available an implicit conversion from A
to JValue
, which I understand it actually means A
is a primitive type). The ~
operator offers a nice way of constructing JObject
's out of JField
's, which is just a type alias for (String, JValue)
.
In this case, map values type is Any
, so implicit conversions don't take place and hence the compiler throws the following error:
value ~ is not a member of (String, Any)
[error] val json = r.reduceLeft(_ ~ _)
Is there a solution for what I want to accomplish?
myMap
, why not callSerialization.write(myMap)
directly? – GestmyMap
, that's the purpose of using a JSON scala library such asjson4s
– Engdahlorg.json4s.jackson.Serialization.write(myMap)
does exactly that. (I used the jackson version of json4s, but this should work for the native version as well). – Gest