我正在尝试学习Scala,并且试图解析JSON文件。我有两行代码:

var jVal:JValue = parse(json);
val totalCount:Int = (jVal \\ "totalCount").asInstanceOf[Int];


但是,(jVal \\ "totalCount")返回一个JInt而不是一个int。如果我将其打印为字符串,则它看起来像"JInt(38)"

我到底如何将其转换为常规int?我当前的代码抛出一个异常,说


net.liftweb.json.JsonAST$JInt无法转换为java.lang.Integer


我搜寻了互联网,但找不到任何答案。我真的希望不要手动解析并删除字符串的“ JInt()”部分,而只是将其作为整数获取。

我肯定会错过一种简单的方法吗?

最佳答案

由于JInt是一个case类,因此提取值的便捷方法是在match中使用提取器表达式:

myJValue match {
  case JInt(x) => /* do something with x */
  case JString(s) => /* do something with s */
  /* etc. */
}


或只是赋值语句,当您知道期望的类型时:

val JInt(totalCount) = (jVal \\ "totalCount")


这会将totalCount定义为JSON中“ totalCount”的值。请注意,它将是BigInt类型。如果需要,可以使用BigInt方法将Int转换为toInt。但是,如果您的数字对于Int太大,则此方法将为您提供一个不同的数字,而不是错误。因此,如果完全有可能,请首先使用isValidInt进行检查。



您也可以使用num字段或values方法获取值,但是在您的代码中很难使用。要使用num,您必须将JValue转换为JInt。而且,如果不强制转换为JInt,您将不知道values结果的类型。

10-06 11:26