簡體   English   中英

使用 Scala Argonaut 解析 JSON 數組

[英]Parse JSON array using Scala Argonaut

我正在使用 Scala 和 Argonaut,試圖解析以下 JSON:

[
    {
        "name": "apple",
        "type": "fruit",
        "size": 3
    },
    {
        "name": "jam",
        "type": "condiment",
        "size": 5
    },
    {
        "name": "beef",
        "type": "meat",
        "size": 1
    }
]

並努力解決如何迭代並將值提取到List[MyType] ,其中MyType將具有名稱、類型和大小屬性。

我很快會發布更具體的代碼(我嘗試了很多東西),但基本上我想了解光標的工作原理,以及如何遍歷數組等。我嘗試使用\\\\ (downArray) 移動到頭部數組,然后:->-遍歷數組,然后--\\ (downField) 不可用(至少 IntelliJ 不這么認為)。 所以問題是我該怎么做:

  • 導航到數組
  • 遍歷數組(並知道我什么時候完成)
  • 為每個字段提取字符串、整數等值 - jdecode[String] ? as[String]

最簡單的方法是為MyType定義一個編解碼器。 然后編譯器會很高興地為List[MyType]等構造一個解碼器。我將在這里使用一個普通類(不是案例類)來清楚地說明發生了什么:

class MyType(val name: String, val tpe: String, val size: Int)

import argonaut._, Argonaut._

implicit def MyTypeCodec: CodecJson[MyType] = codec3(
  (name: String, tpe: String, size: Int) => new MyType(name, tpe, size),
  (myType: MyType) => (myType.name, myType.tpe, myType.size)
)("name", "type", "size")

codec3采用兩個參數列表。 第一個有兩個參數,它們允許您告訴如何從Tuple3創建MyType的實例,反之亦然。 第二個參數列表允許您指定字段的名稱。

現在您可以編寫如下內容(如果json是您的字符串):

Parse.decodeValidation[List[MyType]](json)

你已經完成了。

由於您不需要編碼並且只查看解碼,因此您可以按照 Travis 的建議進行操作,但是通過實現另一個隱式:MyTypeDecodeJson

implicit def MyTypeDecodeJson: DecodeJson[MyType] = DecodeJson(
    raw => for {
    name     <- raw.get[String]("name")
    type     <- raw.get[String]("type")
    size     <- raw.get[Int]("size")
  } yield MyType(name, type, size))

然后解析您的列表:

Parse.decodeValidation[List[MyType]](jsonString)

假設MyType是一個案例類,以下也適用:

case class MyType(name: String, type: String, size: Int)

object MyType {
    implicit val createCodecJson: CodecJson[MyType] = CodecJson.casecodec3(apply, unapply)(
        "name",
        "type",
        "size"
    )
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM