【问题标题】:JsonParseException: Unexpected character (':' (code 58))JsonParseException:意外字符(':'(代码 58))
【发布时间】:2018-07-22 13:39:49
【问题描述】:

在尝试使用Play FrameworkScalaJsonJSON automated mapping 使用case classes 在Scala 中学习JSON-解析时,我遇到了上述错误。 p>

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

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

  • JSON 中的键"column" 更改为"Column"(大写“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

【问题讨论】:

    标签: json scala parsing playframework


    【解决方案1】:

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

    {
      "name": "column_name"
    }
    

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

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

    【讨论】:

    • 我还没有找到任何 link 来解释 error codes 的所有不同 JsonParseException;每当我遇到它时,都会在这里分享我的发现
    猜你喜欢
    • 2015-03-23
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 2016-08-31
    • 2015-08-28
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    相关资源
    最近更新 更多