Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala类型参数似乎得到了";";_Scala_Lift_Lift Json - Fatal编程技术网

Scala类型参数似乎得到了";";

Scala类型参数似乎得到了";";,scala,lift,lift-json,Scala,Lift,Lift Json,我使用lift json将json字符串反序列化为Scala case类。我正在解析的JSON有一个公共结构:一个数据、成功和错误字段,其中数据包含感兴趣的位。我创建了一个APIResponse类来解释这个结构,并创建了一个简单的解析方法,该方法为“data”中包含的对象的类型获取一个类型参数: import net.liftweb.json.Serialization.read import net.liftweb.json.DefaultFormats object JSONParseTe

我使用lift json将json字符串反序列化为Scala case类。我正在解析的JSON有一个公共结构:一个数据、成功和错误字段,其中数据包含感兴趣的位。我创建了一个APIResponse类来解释这个结构,并创建了一个简单的解析方法,该方法为“data”中包含的对象的类型获取一个类型参数:

import net.liftweb.json.Serialization.read
import net.liftweb.json.DefaultFormats

object JSONParseTest extends App {
  implicit val formats = DefaultFormats

  def parse[T: Manifest](json: String) = {
    read[APIResponse[T]](json)
  }

  val resultA = parse[TypeA](""" { "data": { "foo": "string" }, "success": true } """)
  println(resultA)
  val resultB = parse[TypeB](""" { "data": { "bar": "string" }, "success": true } """)
  println(resultB)
}

case class TypeA(foo: String)
case class TypeB(bar: String)

case class APIResponse[D](data: D, success: Boolean, error: Option[String]) {
  override def toString: String =
    if(success) {
      "SUCCESSFUL: " + data.toString
    } else {
      "ERROR: " + error.get
    }
}
对于解析的第一个对象,一切都很好。但是,由于某种原因,解析的第二个对象似乎被“卡住”,其执行方式就好像传递了第一个类型参数而不是第二个类型参数。正如您在下面的输出中所看到的,lift json正在json字符串中查找“foo”字段,但找不到它;'“foo”存在于TypeA上,但不存在于TypeB上。我已经检查了parse方法中的清单,它的类型是正确的。如果我注释掉第一个解析/打印,第二个开始工作。有没有任何关于为什么这不符合预期的指示?这让我有点难以置信

SUCCESSFUL: TypeA(string)

Exception in thread "main" net.liftweb.json.MappingException: No usable value for data
No usable value for foo
Did not find value which can be converted into java.lang.String
    at net.liftweb.json.Meta$.fail(Meta.scala:191)
    at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:357)
    at net.liftweb.json.Extraction$.build$1(Extraction.scala:317)
    at net.liftweb.json.Extraction$$anonfun$12.apply(Extraction.scala:253)
    at net.liftweb.json.Extraction$$anonfun$12.apply(Extraction.scala:253)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
    at scala.collection.immutable.List.foreach(List.scala:76)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:233)
    at scala.collection.immutable.List.map(List.scala:76)
    at net.liftweb.json.Extraction$.instantiate$1(Extraction.scala:253)
    at net.liftweb.json.Extraction$.newInstance$1(Extraction.scala:286)
    at net.liftweb.json.Extraction$.build$1(Extraction.scala:315)
    at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$extract0(Extraction.scala:366)
    at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$extract0(Extraction.scala:199)
    at net.liftweb.json.Extraction$.extract(Extraction.scala:43)
    at net.liftweb.json.JsonAST$JValue.extract(JsonAST.scala:300)
    at net.liftweb.json.Serialization$.read(Serialization.scala:58)
    at jmullin.api.Test$.parse(API.scala:11)
    at jmullin.api.Test$delayedInit$body.apply(API.scala:16)
    at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
    at scala.App$$anonfun$main$1.apply(App.scala:60)
    at scala.App$$anonfun$main$1.apply(App.scala:60)
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
    at scala.collection.immutable.List.foreach(List.scala:76)
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:30)
    at scala.App$class.main(App.scala:60)
    at jmullin.api.Test$.main(API.scala:7)
    at jmullin.api.Test.main(API.scala)
Caused by: net.liftweb.json.MappingException: No usable value for foo
Did not find value which can be converted into java.lang.String
    at net.liftweb.json.Meta$.fail(Meta.scala:191)
    at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:357)
    at net.liftweb.json.Extraction$.build$1(Extraction.scala:317)
    at net.liftweb.json.Extraction$$anonfun$12.apply(Extraction.scala:253)
    at net.liftweb.json.Extraction$$anonfun$12.apply(Extraction.scala:253)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
    at scala.collection.immutable.List.foreach(List.scala:76)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:233)
    at scala.collection.immutable.List.map(List.scala:76)
    at net.liftweb.json.Extraction$.instantiate$1(Extraction.scala:253)
    at net.liftweb.json.Extraction$.newInstance$1(Extraction.scala:286)
    at net.liftweb.json.Extraction$.build$1(Extraction.scala:315)
    at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:351)
    ... 29 more
Caused by: net.liftweb.json.MappingException: Did not find value which can be converted into java.lang.String
    at net.liftweb.json.Meta$.fail(Meta.scala:191)
    at net.liftweb.json.Extraction$.convert(Extraction.scala:403)
    at net.liftweb.json.Extraction$.build$1(Extraction.scala:314)
    at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:351)
    ... 42 more

事实证明,lift json在幕后对类到构造函数的映射进行了一些记忆,忽略了类型args。当对具有不同类型参数的同一类执行查找时,将返回旧的构造函数,从而导致此处所示的混淆。谜团解决了(尽管问题还没有解决)。

我想知道是否有某种缓存正在进行,它被擦除类型绊倒了。如果你想在github上安装一个sbt可启动项目,我会帮你仔细查看。你可能还想把它发布到Lift列表中,Joni,Lift JSON的维护者通常反应很快。我对Lift JSON的源代码做了一些挖掘,看起来你是对的。class->constructor映射正在进行记忆化,此时类型参数被忽略。我会和乔尼提出来的。谢谢你的提示!确认这是lift json中的错误。请参阅此处的问题:,以及相应的提升列表讨论: