作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
spray-json库使用 toJson
扩展了基本的 Scala 类型方法。我想转换 Any
成 JsValue
如果底层类型有这样的皮条客。我最好的尝试有效,但很冗长:
import cc.spray._
val maybeJson1: PartialFunction[Any, JsValue] = {
case x: BigDecimal => x.toJson
case x: BigInt => x.toJson
case x: Boolean => x.toJson
case x: Byte => x.toJson
case x: Char => x.toJson
case x: Double => x.toJson
case x: Float => x.toJson
case x: Int => x.toJson
case x: Long => x.toJson
case x: Short => x.toJson
case x: String => x.toJson
case x: Symbol => x.toJson
case x: Unit => x.toJson
}
def maybeJson2(any: Any): Option[JsValue] = {
if (pimpExistsFor(any))
Some(any.toJson)
else
None
}
最佳答案
有一个方法,但是它需要大量的反射(reflection),因此很头疼。基本思想如下。 DefaultJsonProtocol
object 继承了一堆包含隐式对象的特征,其中包含 write
方法。每一个都有一个访问器函数,但你不会知道它叫什么。基本上,您只需采用所有不带参数的方法并返回一个具有 write
的对象。获取对象类并返回 JsValue
的方法.如果您发现恰好一个这样的方法返回一个这样的类,请使用反射来调用它。否则,保释。
它看起来像这样(警告,未经测试):
def canWriteMe(writer: java.lang.Class[_], me: java.lang.Class[_]):
Option[java.lang.reflect.Method] =
{
writer.getMethods.find(_.getName == "write").filter{ m =>
classOf[JsValue].isAssignableFrom(m.getReturnType) && {
val parm = m.getParameterTypes()
m.length == 1 && parm(0).isAssignableFrom(me)
}
}
}
def maybeJson2(any: Any): Option[JsValue] = {
val couldWork = {
DefaultJsonProtocol.getClass.getMethods.
filter(_.getParameterTypes.length==0).
flatMap(m => canWriteMe(m.getReturnType, any.getClass).map(_ -> m))
}
if (couldWork.length != 1) None else {
couldWork.headOption.map{ case (wrMeth, obMeth) =>
val wrObj = obMeth.invoke(DefaultJsonProtocol)
val answer = wrMeth.invoke(wrObj, any)
}
}
}
DefaultJsonProtocol
在 REPL 中一步一步地将类分开,找出如何可靠地识别定义作者的对象,然后得到
write
他们的方法。
关于json - 如何基于浓缩动态调度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10770344/
你好,我正在尝试学习如何编写一个没有 else{} else if{} 条件的压缩 if 语句,其中代码打印 YES 或 NO 并在满足条件时播放提示音,我我正在尝试连接此语句。 Message =
试图找到一种方法来浓缩它。不确定最好的方法。基本上,如果满足标准,我会显示一个带有消息参数的警报。我在想也许可以在功能上尝试一下。这是更大的功能 react 组件的一部分。我也在想我是否可以找到一种方
我是一名优秀的程序员,十分优秀!