Хотя решения из другого ответа работают, они гораздо более многословны, чем необходимо. Готовый Circe предоставляет неявный экземпляр Decoder[Map[String, String]]
, поэтому вы можете просто написать следующее:
scala> val doc = """{"a": "x", "b": "y", "c": "z"}"""
doc: String = {"a": "x", "b": "y", "c": "z"}
scala> io.circe.parser.decode[Map[String, String]](doc)
res0: Either[io.circe.Error,Map[String,String]] = Right(Map(a -> x, b -> y, c -> z))
Экземпляр Decoder[Map[String, String]]
определен в сопутствующем объекте Decoder
, поэтому он всегда доступен - вам не нужны никакие импорты, другие модули и т. Д. Circe предоставляет подобные экземпляры для большинства стандартных типов библиотек с приемлемыми экземплярами. Например, если вы хотите декодировать массив JSON в List[String]
, вам не нужно создавать свой собственный Decoder[List[String]]
- вы можете просто использовать тот в неявной области видимости, который приходит из сопутствующего объекта Decoder
.
Это не просто многословный способ решения этой проблемы, это рекомендуемый способ ее решения. Создание вручную явного экземпляра декодера и преобразование из Either
в Try
для составления операций синтаксического анализа и декодирования является ненужным и подверженным ошибкам (если вам действительно нужно получить Try
или Option
или что-то еще, это почти конечно, лучше сделать это в конце).