如何解决使用Scala对象中在Java代码中具有隐式参数的函数
我是否可以在Java代码中使用fromJson
和toJson
方法?我想用它来将我从mongoldb获得的bson文档转换为Scala中的模型类
我的Scala对象在下面,
import com.fasterxml.jackson.databind.{DeserializationFeature,ObjectMapper}
import com.fasterxml.jackson.module.scala.{DefaultScalaModule,ScalaObjectMapper}
object JsonUtils {
val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
mapper.configure(DeserializationFeature.FAIL_ON_UNKNowN_PROPERTIES,false)
def toJson(value: Map[Symbol,Any]): String = {
toJson(value map { case (k,v) => k.name -> v})
}
def toJson(value: Any): String = {
mapper.writeValueAsstring(value)
}
def toMap[V](json:String)(implicit m: Manifest[V]) = fromJson[Map[String,V]](json)
def fromJson[T](json: String)(implicit m : Manifest[T]): T = {
mapper.readValue[T](json)
}
implicit class Marshallable[T](marshallMe: T) {
def toJson: String = JsonUtils.toJson(marshallMe)
}
implicit class Unmarshallable(unMarshallMe: String) {
def toMap: Map[String,Any] = JsonUtils.toMap(unMarshallMe)
def fromJson[T]()(implicit m: Manifest[T]): T = JsonUtils.fromJson[T](unMarshallMe)
}
}
解决方法
在Java代码中,您必须手动解决Scala隐式问题。
尝试像这样致电fromJson
JsonUtils.fromJson("a",scala.reflect.Manifest.classType(LocalUser.class));
或
JsonUtils$.MODULE$.fromJson("a",scala.reflect.Manifest$.MODULE$.classType(LocalUser.class));
基于Calling a Scala from Java Play Framework which takes a ClassTag
关于toJson
,我看不到任何问题。尽管如果您使用参数toJson
调用Map
的重载版本,也许您必须在scala.Predef.Map
或scala.collection.immutable.Map
和java.util.Map
之间进行转换
How can I convert Scala Map to Java Map with scala.Float to java.Float k/v conversion
不建议使用Manifest
/ ClassTag
https://docs.scala-lang.org/overviews/reflection/typetags-manifests.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。