关于scala:将JSON对象解析为对象列表
Parse JSON object into list of objects
我正在尝试使用 circe 将 JSON 对象解码为对象列表。我只想使用JSON响应的一些字段来创建对象,所以我觉得我必须创建一个自定义解码器。
我要制作序列的类定义如下:
case class Review(Id: String, ProductId: String, Rating: Int)
我尝试创建一个这样的自定义解码器:
|
1
2 3 4 5 6 7 8 9 10 |
implicit val reviewDecoder: Decoder[Review] = Decoder.instance { c =>
val resultsC = c.downField("Results") for { |
reviewDecoder.decodeJson(json) 似乎只导致第一个结果,而不是全部。
我有一个这样的 JSON 响应:
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
{
"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],但是我不知道怎么做。
****Edit** Luis\' 回答确实回答了这个问题,但说我有一个更复杂的类,我想创建一个序列:
case class User(id: Int)
case class Review(user: User, ProductId: String, Rating: Int)
在这种情况下,我如何能够创建一系列评论?
我会使用光标来获取数组,然后使用通用解码器。
以下代码在 ammonite 上进行了测试,其中 json 是包含您的示例输入的字符串。
|
1
2 3 4 5 6 7 8 9 10 11 12 |
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} final case class Review(Id: String, ProductId: String, Rating: Int) parse(json).getOrElse(Json.Null).hcursor.downField("Results").as[List[Review]] |
相关讨论
- 如果名称不一对一匹配怎么办?假设 JSON 响应有一个名为"productId"的值,我想将其映射到对象成员"pID",有没有办法指定哪个字段应该映射到哪个字段?
- 是的你可以。查看文档,转到 Custom key mappings via annotations 部分。 (它在底部)。