【发布时间】:2020-10-28 00:23:06
【问题描述】:
这里是个新手。我正在尝试使用 circe 将 JSON 字符串解码为 Scala 中的案例类。我希望将输入 JSON 中的嵌套字段之一解码为 Map[String, String] 而不是为其创建单独的案例类。
示例代码:
import io.circe.parser
import io.circe.generic.semiauto.deriveDecoder
case class Event(
action: String,
key: String,
attributes: Map[String, String],
session: String,
ts: Long
)
case class Parsed(
events: Seq[Event]
)
Decoder[Map[String, String]]
val jsonStr = """{
"events": [{
"ts": 1593474773,
"key": "abc",
"action": "hello",
"session": "def",
"attributes": {
"north_lat": -32.34375,
"south_lat": -33.75,
"west_long": -73.125,
"east_long": -70.3125
}
}]
}""".stripMargin
implicit val eventDecoder = deriveDecoder[Event]
implicit val payloadDecoder = deriveDecoder[Parsed]
val decodeResult = parser.decode[Parsed](jsonStr)
val res = decodeResult match {
case Right(staff) => staff
case Left(error) => error
}
我在属性字段上出现解码错误,如下所示:
DecodingFailure(String, List(DownField(north_lat), DownField(attributes), DownArray, DownField(events)))
我在这里找到了一个关于如何将 JSON 字符串解码为地图的有趣链接:Convert Json to a Map[String, String]
但我不知道该怎么做。
如果有人能指出我正确的方向或帮助我解决这个问题,那就太棒了。
【问题讨论】:
-
虽然您当然可以,但您更喜欢使用 Map[String, String] 而不是适当的案例类?还是属性是动态的?
-
我正在尝试将此案例类转换为另一个具有键和值字段的案例类的数组。我之前尝试过将属性的案例类转换为 Scala 中的映射,但结果很丑陋。所以我一直在寻找一种方法,可以将这个对象作为 Map[String,String] 从 JSON 本身读取。
-
我不明白你的意思:“我正在尝试将此案例类转换为另一个具有键和值字段的案例类的数组” - 为什么你想把一个案例类变成一个Map?我最初的问题仍然是,Map 为您提供了案例类没有的什么?
-
这是我需要做的事情 Luis。对我来说,将 Map[String, String] tp 转换为 Attribute(key: String, value: String) 类型的案例类列表比将一个案例类转换为其他案例类的列表更容易一些字段可能出现在此 JSON 中的属性中,也可能不出现。要回答您的问题,是的,这些字段是动态的,很遗憾,我目前无法要求我们的合作伙伴更改流量模式。
-
好的,在这种情况下,您需要做什么就很清楚了。我会这样做,首先在您的案例类上使用 List[Attribute] 而不是 Map[String, String] 。为 List[Attribute] 定义您自己的显式解码器,然后使用它自动派生 Event 的解码器。我现在在手机上,所以我无法提供代码,但是如果当我可以访问计算机时你仍然没有收到答案,我会试一试。