我有 2 個“測驗”,其中我試圖解碼用戶的那個有效,但我試圖解碼用戶串列的那個無效:
import User._
import io.circe._
import io.circe.syntax._
import io.circe.parser.decode
class UserSuite extends munit.FunSuite:
test("List of users can be decoded") {
val json = """|{
| "data" : [
| {
| "id" : "someId",
| "name" : "someName",
| "username" : "someusername"
| },
| {
| "id" : "someId",
| "name" : "someName",
| "username" : "someusername"
| }
| ]
|}""".stripMargin
println(decode[List[User]](json))
}
test("user can be decoded") {
val json = """|{
| "data" : {
| "id" : "someId",
| "name" : "someName",
| "username" : "someusername"
| }
|}""".stripMargin
println(decode[User](json))
}
失敗的產生
Left(DecodingFailure(List, List(DownField(data))))
盡管 json 的相關結構和解碼器(下方)都是相同的。
final case class User(
id: String,
name: String,
username: String
)
object User:
given Decoder[List[User]] =
deriveDecoder[List[User]].prepare(_.downField("data"))
given Decoder[User] =
deriveDecoder[User].prepare(_.downField("data"))
據我所知,這應該有效,即使根據Travis 的一個較早的回復也是如此,但事實并非如此。
這是一個錯誤嗎?難道我做錯了什么?
作為參考,這是 Scala 3.2.0 和大約 0.14.1
uj5u.com熱心網友回復:
問題是您需要兩個不同的編碼器User,一個期望data欄位解碼第二個 json,另一個data在為串列匯出解碼器時不期望欄位。否則第一個 json 應該是
"""|{
| "data" : [
| {
| "data" :
| {
| "id" : "someId",
| "name" : "someName",
| "username" : "someusername"
| }
| },
| {
| "data" :
| {
| "id" : "someId",
| "name" : "someName",
| "username" : "someusername"
| }
| }
| ]
|}""
最好現在明確
final case class User(
id: String,
name: String,
username: String
)
object User {
val userDec: Decoder[User] = semiauto.deriveDecoder[User]
val preparedUserDec: Decoder[User] = userDec.prepare(_.downField("data"))
val userListDec: Decoder[List[User]] = {
implicit val dec: Decoder[User] = userDec
Decoder[List[User]].prepare(_.downField("data"))
}
}
val json =
"""|{
| "data" : [
| {
| "id" : "someId",
| "name" : "someName",
| "username" : "someusername"
| },
| {
| "id" : "someId",
| "name" : "someName",
| "username" : "someusername"
| }
| ]
|}""".stripMargin
decode[List[User]](json)(User.userListDec)
// Right(List(User(someId,someName,someusername), User(someId,someName,someusername)))
val json1 =
"""|{
| "data" : {
| "id" : "someId",
| "name" : "someName",
| "username" : "someusername"
| }
|}""".stripMargin
decode[User](json1)(User.preparedUserDec)
// Right(User(someId,someName,someusername))
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/536746.html
上一篇:SBT二進制不兼容問題scala-parser-combinators
下一篇:Scala.Symbol的反序列化問題,在Scala2.12版本中,對于Scala.Symbol在Scala2.11中序列化
