首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能用自定义Scala类型(Jerkson)解析这个JSON字符串?

为什么我不能用自定义Scala类型(Jerkson)解析这个JSON字符串?
EN

Stack Overflow用户
提问于 2014-11-05 01:32:05
回答 1查看 240关注 0票数 2

下面的代码用于使用Jerkson解析以下JSON字符串,Jerkson是Jackson的Scala包装器:

代码val vertex = Json.parse[Ranked[UserVertex]](rawString)

Json"originalPos":"515693049","rankScore":1.2409032357406248E8,"ranked":{"userId":"101010110","userName":"John","channel":"thirtyfive"}}

下面的JSON由这个Scala类表示:

代码语言:javascript
复制
case class Ranked[T] (
  val originalPos: String,

  val rankScore: Double,

  val ranked: T
)

T是一个UserVertex类,上面有以下字段(userId、userName、channel)。当我试图解析JSON字符串时,会得到以下错误:

代码语言:javascript
复制
[error] application - Could not parse the string:
{"originalPos":"655330261","rankScore":1.2423105672295567E8,"ranked":{"userId":"655330261","userName":"Sheile Mercado-Mallari","channel":"facebook"}}
java.lang.ClassNotFoundException: T
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at com.codahale.jerkson.util.CaseClassSigParser$.loadClass(CaseClassSigParser.scala:153)

看起来ClassLoader找不到这个类,但是它确实是加载的。知道这是什么根本原因吗?这里是否存在某种多类加载程序问题?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-05 05:55:39

在这种情况下(一个通用案例类),您需要定义您的读取器(它是一个已知的约束)

代码语言:javascript
复制
case class UserVertex(userId:String, userName: String, channel: String)
case class Ranked[T](originalPos: String, rankScore: Double, ranked: T)

注意,在case类中不需要val关键字,因为它将通过使用case关键字自动提供。

代码语言:javascript
复制
import play.api.libs.json._
import play.api.libs.functional.syntax._

implicit def vertexReader: Reads[UserVertex] = Json.reads[UserVertex]

implicit def rankedReader[T](implicit reads: Reads[T]): Reads[Ranked[T]] = (
    (__ \ "originalPos").read[String] ~ 
    (__ \ "rankScore").read[Double] ~ 
    (__ \ "ranked").read[T]
    )(Ranked.apply[T] _)

现在您可以将下面的原始json转换为Ranked

代码语言:javascript
复制
val rawString =
    """{
      |  "originalPos": "515693049",
      |  "rankScore": 1.2409032357406248E8,
      |  "ranked": {
      |    "userId": "101010110",
      |    "userName": "John",
      |    "channel": "thirtyfive"
      |  }
      |}""".stripMargin

使用以下代码

代码语言:javascript
复制
val rankedJson = Json.parse(rawString)
val ranked = Json.fromJson[Ranked[UserVertex]](rankedJson).get

免责声明

使用Play 2.3.5和Scala 2.11.4进行测试

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26748265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档