В настоящее время я извлекаю некоторые показатели из разных источников данных и сохраняю их на карте типа Map[String,Any]
, где ключ соответствует имени метрики, а значение соответствует значению метрики. Мне нужно, чтобы это было более или менее общим, что означает, что типы значений могут быть примитивными типами или списками примитивных типов.
Я хотел бы сериализовать эту карту в строку в формате JSON, и для этого я использую библиотеку json4s
. Дело в том, что это не представляется возможным, и я не вижу возможного решения для этого. Я бы ожидал чего-то вроде следующего, чтобы работать из коробки:)
val myMap: Map[String,Any] = ... // extract metrics
val json = myMap.reduceLeft(_ ~ _) // create JSON of metrics
Переход через исходный код Я видел, что json4s
предоставляет неявные преобразования для преобразования примитивных типов в JValue
, а также для преобразования Traversable[A]/Map[String,A]/Option[A]
до JValue
(при ограничении доступности неявное преобразование от A
до JValue
, которое я понимаю, на самом деле означает, что A
является примитивным типом). Оператор ~
предлагает хороший способ построения JObject
out of JField
's, который является просто псевдонимом типа для (String, JValue)
.
В этом случае тип значений карты равен Any
, поэтому неявные преобразования не выполняются и, следовательно, компилятор выдает следующую ошибку:
value ~ is not a member of (String, Any)
[error] val json = r.reduceLeft(_ ~ _)
Есть ли решение для чего я хочу выполнить?