gpt4 book ai didi

scala 将字符串转换为泛型类型

转载 作者:行者123 更新时间:2023-12-02 21:56:20 24 4
gpt4 key购买 nike

我正在解析一个json。我想将其值转换为其他类型。即

//json = JSON String 
val seq = net.liftweb.json.parse(json).\\("seq").values.toString.toLong
val userName = net.liftweb.json.parse(json).\\("name").values.toString
val intNum = net.liftweb.json.parse(json).\\("intId").values.toInt

我想使用更“scala”的通用方法来转换它,我尝试了这样的方法:

object Converter{
def JSONCaster[T](json:String,s:String):T={
net.liftweb.json.parse(json).\\(s).values.toString.asInstanceOf[T]
}
}

但出现转换错误:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long at scala.runtime.BoxesRunTime.unboxToLong(Unknown Source)

最佳答案

我遇到了同样的问题,并记得 Play 框架有一些功能可以完成类似的操作。在深入研究源代码后,我发现了这个 Class .

基本上,我们可以做这样的事情:

object JSONCaster {

def fromJson[T](json: String, s: String)(implicit converter: Converter[T]): T = {
converter.convert(net.liftweb.json.parse(json).\\(s).values.toString)
}

trait Converter[T] { self =>
def convert(v: String): T
}

object Converter{
implicit val longLoader: Converter[Long] = new Converter[Long] {
def convert(v: String): Long = v.toLong
}

implicit val stringLoader: Converter[String] = new Converter[String] {
def convert(v: String): String = v
}

implicit val intLoader: Converter[Int] = new Converter[Int] {
def convert(v: String): Long = v.toInt
}

// Add any other types you want to convert to, even custom types!
}
}

可以这样调用:

JSONCaster.fromJson[Long](json, "seq")

缺点是我们必须为所有想要转换的类型定义隐式转换器。这样做的好处是可以保持界面真正干净且可重用。

关于scala 将字符串转换为泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17722990/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com