0

リストを含むjsonを逆シリアル化するためにCirceを使用しています。json リスト内のいくつかの項目が壊れていることがあり、それが原因で逆シリアル化全体が失敗することがあります。代わりに、Circe に最善を尽くして、正常にデシリアライズされたすべてのリスト アイテムのリストと、破​​損したアイテムのエラーのリストを返してもらいたいと思います。これはキルケでどのように行うのが最善ですか?

具体的には、これを逆シリアル化しようとしているとしましょう:

val json = """{ "params": {
  "playlist": {
      "name": "Sample Playlist",
      "items": [
        {
          "clipId":"xyz", 
          "name":"abc",
          "properties": {
            "cat": "siamese",
            "dog": "spaniel"            
          }
        },
        {
          "clipId":"pqr", 
          "name":"def",
          "properties": {
            "cat": "tabby",
            "dog": "terrier"
          }
        } 
      ]
   }
}}"""

私はこれをやっています:

import io.circe.Decoder, io.circe.generic.auto._
import scala.util._   

case class Clip(clipId: String, name: String, dog: String)
implicit val decodeClip: Decoder[Clip] = Decoder.instance { c =>
    for {
      id <- c.get[String]("clipId")
      name <- c.get[String]("name")
      dog <- c.downField("properties").get[String]("dog")
    } yield {
      Clip(id, name, dog)
    }
}

val decodeClipsParam = Decoder[List[Clip]].prepare(
  _.downField("params").downField("playlist").downField("items")
)

def deserializedThing(theJson: String) = io.circe.parser.decode(theJson)(decodeClipsParam)

正常に動作し、正しく逆シリアル化します。

scala> deserializedThing(json)
res1: Either[io.circe.Error,List[circeLab.circeLab.Clip]] = Right(List(Clip(xyz,abc,spaniel), Clip(pqr,def,terrier)))

しかし、json リストの 1 つの項目を破損すると ("dog"キーの 1 つを変更し"doggg"て)、逆シリアル化全体が失敗します。破損していないClip項目のリストは表示されず、失敗したことがわかります。

したがって、に逆シリアル化する代わりに、各項目が、または のいずれかであるList[Clip]に逆シリアル化したいと思います。List[Try[Clip]]Success(Clip(xyz,abc,spaniel))Failure(ErrorDescriptionForThatItem)

私は Argonaut でこれを達成することができました (かなり醜いコードを使用して) が、Circe では構文を理解できません。これを達成するための最良の方法は何ですか?ありがとう!

4

1 に答える 1