【问题标题】:Parse Json array with Circe用 Circe 解析 Json 数组
【发布时间】:2017-10-15 16:02:58
【问题描述】:

我是 Circe 的初学者,我想从这个 JSon 中检索信息

[  
   {  
      "sha":"7fd1a60b01f91b314f59955a4e4d4e80d8edf11d",
      "commit":{  
         "author":{  
            "name":"The Octocat",
            "email":"octocat@nowhere.com",
            "date":"2012-03-06T23:06:50Z"
         },
         "committer":{  
            "name":"The Octocat",
            "email":"octocat@nowhere.com",
            "date":"2012-03-06T23:06:50Z"
         },
         "message":"Merge pull request #6 from Spaceghost/patch-1\n\nNew line at end of file.",
      },
      "url":"https://api.github.com/repos/octocat/Hello-World/commits/7fd1a60b01f91b314f59955a4e4d4e80d8edf11d",
   },
   {  
      "sha":"762941318ee16e59dabbacb1b4049eec22f0d303",
      "commit":{  
         "author":{  
            "name":"Johnneylee Jack Rollins",
            "email":"johnneylee.rollins@gmail.com",
            "date":"2011-09-14T04:42:41Z"
         },
         "committer":{  
            "name":"Johnneylee Jack Rollins",
            "email":"johnneylee.rollins@gmail.com",
            "date":"2011-09-14T04:42:41Z"
         },
         "message":"New line at end of file. --Signed off by Spaceghost",
      },
      "url":"https://api.github.com/repos/octocat/Hello-World/commits/762941318ee16e59dabbacb1b4049eec22f0d303",
   },
]

我不明白这段代码如何无法捕获有关“作者”的信息

val doc= parse(response.json.toString()).getOrElse(Json.Null)
doc.hcursor.downArray.downField("commit").right.as[Seq[String]] match {
   case Left(failure) => println("Fail")
   case Right(json) => println("Ok")
}

你有什么想法吗?

提前致谢,

【问题讨论】:

  • 您能提供更多信息吗? response 是什么类型?你的进口是什么?

标签: json scala circe


【解决方案1】:

您的 json 在某些地方包含尾随逗号。这是against 规范。

  val json =
  """[
  {
    "sha":"7fd1a60b01f91b314f59955a4e4d4e80d8edf11d",
    "commit":{
      "author":{
      "name":"The Octocat",
      "email":"octocat@nowhere.com",
      "date":"2012-03-06T23:06:50Z"
    },
      "committer":{
      "name":"The Octocat",
      "email":"octocat@nowhere.com",
      "date":"2012-03-06T23:06:50Z"
    },
      "message":"Merge pull request #6 from Spaceghost/patch-1\n\nNew line at end of file."
    },
    "url":"https://api.github.com/repos/octocat/Hello-World/commits/7fd1a60b01f91b314f59955a4e4d4e80d8edf11d"
  },
  {
    "sha":"762941318ee16e59dabbacb1b4049eec22f0d303",
    "commit":{
      "author":{
      "name":"Johnneylee Jack Rollins",
      "email":"johnneylee.rollins@gmail.com",
      "date":"2011-09-14T04:42:41Z"
    },
      "committer":{
      "name":"Johnneylee Jack Rollins",
      "email":"johnneylee.rollins@gmail.com",
      "date":"2011-09-14T04:42:41Z"
    },
      "message":"New line at end of file. --Signed off by Spaceghost"
    },
    "url":"https://api.github.com/repos/octocat/Hello-World/commits/762941318ee16e59dabbacb1b4049eec22f0d303"
  }
  ]"""

  case class Author(name: String, email: String, date: String)
  case class Committer(name: String, email: String, date: String)
  case class Commit(author: Author, committer: Committer, message: String)
  case class Record(sha: String, commit: Commit, url: String)

  decode[Seq[Record]](json) match {
      case Right(records) => records.foreach(record => println(record.commit.author))
      case Left(error) => println(error)
  }

//Author(The Octocat,octocat@nowhere.com,2012-03-06T23:06:50Z)
//Author(Johnneylee Jack Rollins,johnneylee.rollins@gmail.com,2011-09-14T04:42:41Z)

像你这样的代码也可以工作:

val doc= parse(json).getOrElse(Json.Null)
doc.hcursor.downArray.downField("commit").downField("author").downField("name").as[String] match {
  case Left(failure) => println(failure)
  case Right(name) => println(name)
}
// The Octocat

【讨论】:

    猜你喜欢
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 2021-11-07
    • 2019-04-06
    • 1970-01-01
    相关资源
    最近更新 更多