我输入了json
{"a": "x", "b": "y", "c": "z", .... }
Run Code Online (Sandbox Code Playgroud)
我想将此 json 转换为 Map 之类的 Map[String, String]
所以基本上是键值对的映射。
我怎样才能使用 circe 做到这一点?
请注意,我不知道 Json 中将出现哪些键“a”、“b”、“c”。我所知道的是,它们将始终是字符串,而不是任何其他数据类型。
我在这里查看了自定义解码器https://circe.github.io/circe/codecs/custom-codecs.html但它们仅在您知道标签名称时才起作用。
我在杰克逊找到了一个例子来做到这一点。但不在圈子里
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.databind.ObjectMapper
val data = """
{"a": "x", "b", "y", "c": "z"}
"""
val mapper = new ObjectMapper
mapper.registerModule(DefaultScalaModule)
mapper.readValue(data, classOf[Map[String, String]])
Run Code Online (Sandbox Code Playgroud)
虽然其他答案中的解决方案有效,但它们比必要的要冗长得多。现成的 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))
Run Code Online (Sandbox Code Playgroud)
该Decoder[Map[String, String]]实例是在Decoder伴随对象中定义的,因此它始终可用——您不需要任何导入、其他模块等。Circe 为大多数具有合理实例的标准库类型提供了这样的实例。List[String]例如,如果要将 JSON 数组解码为 ,则无需构建自己的数组Decoder[List[String]]— 只需使用来自Decoder伴随对象的隐式范围内的数组即可。
这不仅是解决此问题的不那么冗长的方法,而且还是推荐的解决方法。手动构建一个明确的解码器实例,并从转换Either到Try撰写解析和解码操作既是不必要的,容易出错的(如果你需要与最终Try还是Option也好,它几乎肯定最好做,在年底)。
| 归档时间: |
|
| 查看次数: |
5040 次 |
| 最近记录: |