首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用circe解析数组

用circe解析数组
EN

Stack Overflow用户
提问于 2021-03-11 12:10:03
回答 1查看 337关注 0票数 2

我有一个json,例如:

代码语言:javascript
复制
[
    [
        "Service ID",
        "VARCHAR",
        1,
        12
    ],
    [
        "Operation",
        "VARCHAR",
        2,
        12
    ],
    [
        "Start Date",
        "VARCHAR",
        3,
        12
    ],
    [
        "End Date",
        "VARCHAR",
        4,
        12
    ],
    [
        "Agent Position",
        "VARCHAR",
        5,
        12
    ],
    [
        "Customer ID",
        "VARCHAR",
        6,
        12
    ],
    [
        "Product",
        "VARCHAR",
        7,
        12
    ],
    [
        "Service Type",
        "VARCHAR",
        8,
        12
    ],
    [
        "Agent",
        "VARCHAR",
        9,
        12
    ]
]

我想在那里按摩/映射为一个案例类

代码语言:javascript
复制
{
"schema": [
    {
        "COLUMN_NAME":"Service ID",
        "DATA_TYPE":"VARCHAR",
        "ORDINAL_POSITION":1,
        "JDBC_DATA_TYPE12":12
    },
    {
        "COLUMN_NAME":"Operation",
        "DATA_TYPE":"VARCHAR",
        "ORDINAL_POSITION":2,
        "JDBC_DATA_TYPE12":12
    },
    {
        "COLUMN_NAME":"Start Date",
        "DATA_TYPE":"VARCHAR",
        "ORDINAL_POSITION":3,
        "JDBC_DATA_TYPE12":12
    },
    {
        "COLUMN_NAME":"End Date",
        "DATA_TYPE":"VARCHAR",
        "ORDINAL_POSITION":4,
        "JDBC_DATA_TYPE12":12
    },
    {
        "COLUMN_NAME":"Agent Position",
        "DATA_TYPE":"VARCHAR",
        "ORDINAL_POSITION":5,
        "JDBC_DATA_TYPE12":12
    },
    {
        "COLUMN_NAME":"Customer ID",
        "DATA_TYPE":"VARCHAR",
        "ORDINAL_POSITION":6,
        "JDBC_DATA_TYPE12":12
    },
    {
        "COLUMN_NAME":"Product",
        "DATA_TYPE":"VARCHAR",
        "ORDINAL_POSITION":7,
        "JDBC_DATA_TYPE12":12
    },
    {
        "COLUMN_NAME":"Service Type",
        "DATA_TYPE":"VARCHAR",
        "ORDINAL_POSITION":8,
        "JDBC_DATA_TYPE12":12
    },
    {
        "COLUMN_NAME":"Agent",
        "DATA_TYPE":"VARCHAR",
        "ORDINAL_POSITION":9,
        "JDBC_DATA_TYPE12":12
    }
    ]
}

我试着遵循:Decoding structured JSON arrays with circe in Scala作为一种建议,但是有些方法已经不存在了,比如deleteGoRight等等。

我尝试过这样的尝试:

代码语言:javascript
复制
implicit val decoder: Decoder[Schema] = { (hCursor: HCursor) =>
    for {
      colName <- hCursor.as[String]
      colNameC = hCursor.delete
      dtype <- colNameC.right.as[String]
      dtypeC = colNameC.delete
      pos <- dtypeC.right.as[Double]
      posC = dtypeC.delete
      jtype <- posC.right.as[Double]
    } yield Schema(colName, dtype, pos, jtype) }

  parser.decode[List[Schema]]("""["Service Type","VARCHAR",8,12]""") match {
    case Right(applicants) => println(applicants)
    case Left(ex) => println(s"Oops something is wrong with decoding value ${ex}")
  }

但它无法解码,这些错误很难解释。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-11 23:27:12

可以在downN上使用HCursor方法访问列表中的特定元素。

代码语言:javascript
复制
import io.circe.parser.decode
import io.circe.{Decoder, HCursor, _}

object Main extends App {

  val payload =
    """[
      |    [
      |        "Service ID",
      |        "VARCHAR",
      |        1,
      |        12
      |    ],
      |    [
      |        "Operation",
      |        "VARCHAR",
      |        2,
      |        12
      |    ]
      |]""".stripMargin


  val schemas: Either[Error, List[Schema]] = decode[List[Schema]](payload)
  println(schemas)
}

case class Schema(name: String, dataType: String, position: Int, jdbcType: Int)

object Schema {

  implicit val schemaDecoder: Decoder[Schema] = (c: HCursor) => for {
    name <- c.downN(0).as[String]
    dataType <- c.downN(1).as[String]
    position <- c.downN(2).as[Int]
    jdbcType <- c.downN(3).as[Int]
  } yield Schema(name, dataType, position, jdbcType)
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66582309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档