Scala Json 解析

Scala Json parsing

这是我得到的输入 json,它是嵌套的 json 结构,我不想直接映射到 class,需要对某些对象进行自定义解析正如我所说 classes

{
    "uuid": "b547e13e-b32d-11ec-b909-0242ac120002",
    "log": {
        "Response": {
            "info": {
                "receivedTime": "2022-02-09T00:30:00Z",
                "isSecure": "Yes",

                "Data": [{
                    "id": "75641",
                    "type": "vendor",
                    "sourceId": "3",
                    "size": 53
                }],
                "Group": [{
                        "isActive": "yes",
                        "metadata": {
                            "owner": "owner1",
                            "compressionType": "gz",
                            "comments": "someComment",
                            "createdDate": "2022-01-11T11:00:00Z",
                            "updatedDate": "2022-01-12T14:17:55Z"
                        },
                        "setId": "1"
                    },
                    {
                        "isActive": "yes",
                        "metadata": {
                            "owner": "owner12",
                            "compressionType": "snappy",
                            "comments": "someComment",
                            "createdDate": "2022-01-11T11:00:00Z",
                            "updatedDate": "2022-01-12T14:17:55Z"
                        },
                        "setId": "2"
                    },
                    {
                        "isActive": "yes",

                        "metadata": {
                            "owner": "owner123",
                            "compressionType": "snappy",
                            "comments": "someComment",
                            "createdDate": "2022-01-11T11:00:00Z",
                            "updatedDate": "2022-01-12T14:17:55Z"
                        },
                        "setId": "4"
                    },
                    {
                        "isActive": "yes",
                        "metadata": {
                            "owner": "owner124",
                            "compressionType": "snappy",
                            "comments": "someComments",
                            "createdDate": "2022-01-11T11:00:00Z",
                            "updatedDate": "2022-01-12T14:17:55Z"
                        },
                        "setId": "4"
                    }
                ]
            }
        }
    }
}

我正在尝试播放的代码 json 也试过 circe 。请帮助 ..scala 世界的新手

以下是对象和案例class

case class DataCatalog(uuid: String, data: Seq[Data], metadata: Seq[Metadata])

object DataCatalog {
case class Data(id: String,
                       type: String,
                       sourceId: Option[Int],
                       size: Int)

case class Metadata(isActive: String,
                    owner: String,
                    compressionType: String,
                    comments: String,
                    createdDate: String,
                    updatedDate: String
                    )


 def convertJson(inputjsonLine: String): Option[DataCatalog] = {
    val result = Try {
      //val doc: Json = parse(line).getOrElse(Json.Null)
      //val cursor: HCursor = doc.hcursor
      //val uuid: Decoder.Result[String] = cursor.downField("uuid").as[String]
      
      val lat = (inputjsonLine \ "uuid").get

      
     
      DataCatalog(uuid, data, group)
    }
    //do pattern matching
    result match {
      case Success(dataCatalog) => Some(dataCatalog)
      case Failure(exception) =>
        
    }
  }
  }

任何解析 api 都可以。

如果您使用 Scala Play,对于每种情况 class 您应该有一个伴随对象,它将对您 read/write 对象 in/from json 有很大帮助:

object Data {
  import play.api.libs.json._

  implicit val read = Json.reads[Data ]
  implicit val write = Json.writes[Data ]

  def tupled = (Data.apply _).tupled
}

object Metadata {
  import play.api.libs.json._

  implicit val read = Json.reads[Metadata ]
  implicit val write = Json.writes[Metadata ]

  def tupled = (Metadata.apply _).tupled
}

要求每个伴随对象与案例 class 位于同一文件中。对于您的 json 示例,您需要更多 case classes 因为那里有很多嵌套对象(日志、响应、信息,每一个)

或者,您可以阅读您感兴趣的领域:

(jsonData \ "fieldName").as[CaseClassName]

您可以尝试访问数据值:

(jsonData \ "log" \ "Response" \ "info" \ "Data").as[Data]

元数据相同