Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将JSON对象解析为对象列表_Json_Scala_Circe - Fatal编程技术网

将JSON对象解析为对象列表

将JSON对象解析为对象列表,json,scala,circe,Json,Scala,Circe,我尝试使用circe将JSON对象解码为对象列表。我只想使用JSON响应的一些字段来创建对象,所以我觉得我必须创建一个自定义解码器 我要创建序列的类定义如下: 案例类评审(Id:String,ProductId:String,Rating:Int) 我尝试创建一个自定义解码器,如下所示: implicit val reviewDecoder: Decoder[Review] = Decoder.instance { c => val resultsC = c.downField("R

我尝试使用circe将JSON对象解码为对象列表。我只想使用JSON响应的一些字段来创建对象,所以我觉得我必须创建一个自定义解码器

我要创建序列的类定义如下:

案例类评审(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)
}
 {
   "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],但我不知道如何解析

****编辑**Luis的答案确实回答了这个问题,但我想创建一个更复杂的类序列:

case类用户(id:Int)

案例类审查(用户:用户,产品ID:String,评级:Int)


在这种情况下,我怎样才能创建一系列评论呢?

我只需要使用光标获取数组,然后使用通用解码器

以下代码在ammonite上进行了测试,其中
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)))

如果名字一对一不匹配怎么办?假设JSON响应有一个名为“productId”的值,我想将其映射到对象成员“pID”,有没有办法指定哪个字段应该映射到哪个字段?是的,可以。查看,转到
通过注释自定义键映射部分。(在底部)。