我正在尝试使用circe将JSON对象解码为对象列表。我只想使用JSON响应的某些字段来创建对象,所以我觉得我必须创建一个自定义解码器。
我要对其进行排序的类定义如下:
case class Review(Id: String, ProductId: String, Rating: Int)
我试图创建一个这样的自定义解码器:
implicit val reviewDecoder: Decoder[Review] = Decoder.instance { c =>
val resultsC = c.downField("Results")
for {
id <- resultsC.downArray.get[String]("Id")
productId <- resultsC.downArray.get[String]("ProductId")
rating <- resultsC.downArray.get[Int]("Rating")
} yield Review(id, productId, rating)
}
reviewDecoder.decodeJson(json)
似乎只导致第一个结果,而不是全部。
我有这样的JSON响应:
{
"Limit":2,
"Offset":0,
"TotalResults":31,
"Locale":"en_US",
"Results":
[
{"Id":"14518388",
"CID":"21a9436b",
"ProductId":"Product11",
"AuthorId":"jcknwekjcnwjk",
"Rating":3
},
{"Id":"14518035",
"CID":"8d67b6f5",
"ProductId":"Product11",
"AuthorId":"fnkjwernfk",
"Rating":3
}
],
"Includes":{},
"HasErrors":false,
"Errors":[]}
我希望能够使用circe解析此JSON对象以创建Seq [Review],但是我很困惑。
****编辑**路易斯的回答确实回答了这个问题,但是说我有一个更复杂的类,我想创建一个序列:
case class User(id: Int)
case class Review(user: User, ProductId: String, Rating: Int)
在这种情况下,如何创建评论序列?
答案 0 :(得分:0)
我只需要使用光标来获取 Array ,然后使用通用解码器即可。
以下代码已在炸药上进行了测试,其中json
是包含您的示例输入的字符串。
import $ivy.`io.circe::circe-core:0.11.1`
import $ivy.`io.circe::circe-generic:0.11.1`
import $ivy.`io.circe::circe-parser:0.11.1`
import io.circe.{Decoder, Jsom}
import io.circe.parser.parse
final case class Review(Id: String, ProductId: String, Rating: Int)
implicit val reviewDecoder: Decoder[Review] = io.circe.generic.semiauto.deriveDecoder
parse(json).getOrElse(Json.Null).hcursor.downField("Results").as[List[Review]]
// res: io.circe.Decoder.Result[List[Review]] = Right(List(Review("14518388", "Product11", 3), Review("14518035", "Product11", 3)))