简体   繁体   English

使用play-json库对自定义Scala对象进行Scala反序列化

[英]Scala deserialization of custom scala object with play-json library

My ScalaTest breaks while trying to parse a JSON string into a custom Scala object. 尝试将JSON字符串解析为自定义Scala对象时,我的ScalaTest中断了。 I'm using Play-Json library for [de]serialization. 我正在使用Play-Json库进行[反序列化]。 Serialization works fine but the deserialization breaks while running a unit test on the Blah class. 序列化工作正常,但是在Blah类上运行单元测试时,反序列化会中断。 The test invokes the fromJsonString() method and Im using ScalaTest library for unit testing. 该测试使用ScalaTest库调用fromJsonString()方法和Im进行单元测试。 Appreciate some help here. 在这里感谢一些帮助。

Exception trace: (Full trace - http://pasted.co/e627b1ee ) 异常跟踪:(完整跟踪-http : //pasted.co/e627b1ee

An exception or error caused a run to abort: scala.collection.immutable.$colon$colon.hd$1()Ljava/lang/Object; 
java.lang.NoSuchMethodError: scala.collection.immutable.$colon$colon.hd$1()Ljava/lang/Object;
    at play.api.libs.json.jackson.JsValueDeserializer.deserialize(JacksonJson.scala:144)
    at play.api.libs.json.jackson.JsValueDeserializer.deserialize(JacksonJson.scala:108)
    at play.api.libs.json.jackson.JsValueDeserializer.deserialize(JacksonJson.scala:103)
    at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:3536)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1872)
    at play.api.libs.json.jackson.JacksonJson$.parseJsValue(JacksonJson.scala:226)
    at play.api.libs.json.Json$.parse(Json.scala:21)
    at com.project.gateway.model.Blah.fromJsonString(Blah.scala:98)

Scala Object definition: Scala对象定义:

case class Blah(name: String, id: String) {

      implicit val BlahWrites: Writes[Blah] = (
        (JsPath \ "name").write[String] and
          (JsPath \ "id").write[String]
        )(unlift(Blah.unapply))

      implicit val BlahReads: Reads[Blah] = (
        (JsPath \ "name").read[String] and
          (JsPath \ "id").read[String]
        )(Blah)


      def toJsonString(): String = {
        Json.toJson(this).toString()
      }

      def fromJsonString(jsonString: String): Blah = {
        val value = Json.parse(jsonString)
        value.as[Blah]
        //Json.fromJson[Blah](value).get
      }
    }

My SBT file: 我的SBT文件:

name := "Project"

version := "1.0"

scalaVersion := "2.11.7"

libraryDependencies += "com.typesafe.scala-logging" % "scala-logging_2.11" % "3.1.0"
libraryDependencies += "org.scalatest" % "scalatest_2.11" % "2.2.4" % "test"
libraryDependencies += "com.typesafe.play" % "play-json_2.10" % "2.4.2"

I guess there is difference between the version of scala-library at runtime/test, and the one used to build the dependency which is raising the error. 我猜在运行时/测试时,scala库的版本与用于建立依赖关系的版本之间存在差异,这会引发错误。

If using SBT or Maven, you can check the used libraries (including the transitive one), so check there is no incompatibility regarding the scala-library (pull in different versions by different dependencies). 如果使用SBT或Maven,则可以检查已使用的库(包括可传递库),因此请检查scala库是否存在不兼容性(以不同的依赖关系拉入不同版本)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM