JsonParseException:意外的字符(':'(代码58))

时间:2018-02-12 11:35:57

标签: json scala parsing playframework

尝试使用Scala ScalaJson通过JSON automated mapping使用Play Framework来学习case class中的JSON- 解析,我收到了上述错误。

com.fasterxml.jackson.core.JsonParseException: Unexpected character (':' (code 58)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
 at [Source: 
"column" : {
    "name" : "column_name"
}; line: 2, column: 11]
    at com.fasterxml.jackson.core.JsonParser._constructError(scalaPlayJson.sc:1577)
    at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(scalaPlayJson.sc:529)
    at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(scalaPlayJson.sc:458)
    at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._handleOddValue(scalaPlayJson.sc:1620)
    at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(scalaPlayJson.sc:685)
    at play.api.libs.json.jackson.JsValueDeserializer.deserialize(scalaPlayJson.sc:175)
    at play.api.libs.json.jackson.JsValueDeserializer.deserialize(scalaPlayJson.sc:124)
    at play.api.libs.json.jackson.JsValueDeserializer.deserialize(scalaPlayJson.sc:119)
    at com.fasterxml.jackson.databind.ObjectMapper._readValue(scalaPlayJson.sc:3704)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(scalaPlayJson.sc:2001)
    at play.api.libs.json.jackson.JacksonJson$.parseJsValue(scalaPlayJson.sc:231)
    at play.api.libs.json.StaticBinding$.parseJsValue(scalaPlayJson.sc:12)
    at play.api.libs.json.Json$.parse(scalaPlayJson.sc:167)
    at #worksheet#.#worksheet#(scalaPlayJson.sc:50)

有问题的输入是最简单的 JSON可以想到[file:column.json]

{
  "column": {
    "name": "column_name"
  }
}

我正在使用以下代码来解析给定的Json文件。

case class Column(
                   tableId:      Option[Int]     = None,
                   id:           Option[Int]     = None,
                   name:         String,
                   shouldCopy:   Option[Boolean] = None,
                   dataType:     Option[String]  = None,
                   defaultValue: Option[String]  = None
                 ) {
  def showColumnInfo: Unit = println(s"Name = $name")
}

object Column {
  implicit val reads = Json.reads[Column]
  implicit val writes = Json.writes[Column]
  implicit val format = Json.format[Column]
}

Json.parse(Source.fromFile(s"$path/column.json").mkString("")).
  asOpt[Column].
  getOrElse(Column(name = "Could not read")).
  showColumnInfo

我尝试过的事情没有成功:

  • "column"中的密钥"Column"更改为JSON(大写“C”以匹配case class的名称)
  • 将上述JSON提供为String,而不是从文件中读取

我的问题是:

  • 导致错误的原因是什么?
  • 我在哪里可以找到所有JsonParseException 错误代码的列表及其含义?

框架版本:

  • Scala v2.11.11
  • Play-Json v2.6.6 [SBT"com.typesafe.play" %% "play-json" % "2.6.6"]
  • SBT v1.0.3

1 个答案:

答案 0 :(得分:1)

原来我的输入JSON错误(它是有效 JSON,但根据提供的case class不正确。我把它包裹在一个额外的一对括号 {}里面应该是

{
  "name": "column_name"
}

对于以Play-JSON开头的人,我建议他们使用JsValue.as[T]代替JsValue.asOpt[T],因为后者不会报告任何错误和你会不停地敲打你的头(我浪费了5个多小时 :-( )。 docs提前警告过:

  

虽然asOpt方法更安全,但任何错误信息都会丢失。