【问题标题】:illegal start of simple expression ScalaScala 简单表达式的非法开头
【发布时间】:2018-08-16 14:16:36
【问题描述】:

我有两个版本的 Scala 编译器 2.11.12 和 2.12.4。我有一个代码可以覆盖 json 协议的读写方法。代码是这样的。

implicit lazy val abcJsonProtocol: RootJsonFormat[XYZ] = new 
RootJsonFormat[XYZ] {

  override def write(obj: XYZ): JsValue = {
    val baseJson =
      JsObject(
    “abc” -> obj.efg.toJson,
    “ikj” -> obj.mno.toJson
    )

    obj
      .map(value => JsObject(baseJson.fields + (“wxy” -> 
      value.toJson)))
    .getOrElse(baseJson)
  }

  override def read(value: JsValue): XYZ = {
    val jsObject = value.asJsObject
    jsObject.getFields("abc",
      "kJ") match {
      case Seq(efg, mno) =>
        XYZ(
          efg = efg.convertTo[String],
          mno = mno.convertTo[String],

        )
    }
  }
   }

错误是这样的

illegal start of simple expression
[error]           )
[error]           ^
')' expected but '}' found.
[error]         }
[error]         ^

仅在2.11.12版本编译失败,在后面的版本通过 提前致谢。

【问题讨论】:

  • 这个mno = mno.convertTo[String],在右括号)之前有一个尾随逗号,
  • 所以不要从编译器输出中删除行号。

标签: json scala spray


【解决方案1】:

你的案例类

  case class XYZ(efg: String, mno: String)

然后,像这样定义协议。

  import spray.json._
  implicit object XYZFormat extends RootJsonFormat[XYZ] {
      // writer function
      def write(obj: XYZ): JsValue = JsObject(
        "efg" -> JsString(obj.efg),
        "mno" -> JsString(obj.mno)
      )

      // reader function
      def read(json: JsValue): XYZ =
        json.asJsObject.getFields("efg", "mno") match {
          case Seq(JsString(efg), JsString(mno)) => XYZ(efg, mno)
          case _ => throw DeserializationException("Not valid XYZ model")
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 2023-03-26
    相关资源
    最近更新 更多