[英]Use functions from a Scala object that have implicit parameters in java code
Is there a way that I can use the fromJson
and toJson
methods in my java code?有没有办法可以在我的 Java 代码中使用
fromJson
和toJson
方法? I would want to call it to transform a bson document that I get from mongoldb to a model class that I have in Scala我想调用它来将我从 mongoldb 获得的 bson 文档转换为我在 Scala 中拥有的模型类
My Scala object is below,我的 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)
}
}
In Java code you have to resolve Scala implicits manually.在 Java 代码中,您必须手动解析 Scala 隐式。
Try to call fromJson
like尝试调用
fromJson
类的
JsonUtils.fromJson("a", scala.reflect.Manifest.classType(LocalUser.class));
or或者
JsonUtils$.MODULE$.fromJson("a", scala.reflect.Manifest$.MODULE$.classType(LocalUser.class));
Based on Calling a Scala from Java Play Framework which takes a ClassTag基于从带有 ClassTag 的 Java Play Framework 调用 Scala
Regarding toJson
I can't see problems.关于
toJson
我看不出问题。 Although if you call overloaded version of toJson
with Map
argument, maybe you'll have to convert between scala.Predef.Map
aka scala.collection.immutable.Map
and java.util.Map
虽然如果你用
Map
参数调用toJson
重载版本,也许你必须在scala.Predef.Map
aka scala.collection.immutable.Map
和java.util.Map
之间转换
Convert Java Map to Scala Map 将 Java 映射转换为 Scala 映射
How can I convert Scala Map to Java Map with scala.Float to java.Float k/v conversion 如何使用 scala.Float 将 Scala Map 转换为 Java Map 到 java.Float k/v 转换
By the way, Manifest
is deprecated in favor of ClassTag
/ TypeTag
顺便说一句,
Manifest
已被弃用,以支持ClassTag
/ TypeTag
https://docs.scala-lang.org/overviews/reflection/typetags-manifests.html https://docs.scala-lang.org/overviews/reflection/typetags-manifests.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.