如何将 jsonAST.Jint 转换为 int

3

我正在尝试学习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()"部分,只是为了得到一个整数。
我肯定是错过了一种简单的方法吧?
1个回答

5

由于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类型。如果您想的话,可以使用toInt方法将BigInt转换为Int。但是,如果您的数字太大而无法转换为Int,该方法将返回一个不同的数字而不是错误。因此,如果可能存在巨大的数字,您需要先使用isValidInt进行检查。


您还可以使用num字段或values方法获取该值,但在代码中更难处理。要使用num,您必须将JValue强制转换为JInt。如果您不强制转换为JInt,则无法知道values结果的类型。


当我执行val totalCount = (jval \ "totalCount").num.toInt时,它会显示无法解析符号num。我不确定为什么它不存在,因为我已经导入了net.liftweb.json._和net.liftweb.json.DefaultFormats。 - Arthur Lee
我可能不应该编辑我的初始评论,但它已经改变以反映我的当前发现。 - Arthur Lee
如果是这种情况,那么在Scala中解析JSON文件的正确方法是什么? JSON文件的一部分如下所示:{      “totalCount”:38,      “page”:1,      “transactions”:[{          “Date”:“2013-12-22”,          “Ledger”:“电话和互联网费用”,          “Amount”:“-110.71”,          “Company”:“SHAW CABLESYSTEMS CALGARY AB”      }] - Arthur Lee
@ArthurLee 我有一个新建议。我认为这个实际上是有效的。 - Dan Getz
它完美地运行了!非常感谢。如果我想从JSON文件中获取一个Transaction对象(我已经定义好了),那么使用val JArray(transactions) = (jVals \ "transactions")是否会看起来类似? - Arthur Lee
是的,API 表示 transactions 将是一个 List[JValue] - Dan Getz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接