>我正在尝试解析包含数组数组的 json 对象。示例 json 如下所示 -
val data = """
{
"ColumnTitles": ["Product Code","Product Name","Quantity"],
"CellValues": [
["prod01","Half Shirt",2],
["prod02","Full Shirt",1],
["prod03","Jeans Pant",2]
]
}
"""
val dataJson = Json.parse(data)
val cTitles = ((dataJson "ColumnTitles").asOpt[List[String]).get
val cValues = ((dataJson "CellValues").asOpt[List[List[Any]]]).get
我知道,最后一行会显示编译错误,但你明白我想要什么 - Any
可以是字符串、Int 或其他 json 对象。实际上,用户将发送一些任意表数据,其列数,行数,列数据类型 - 在编译时一切都是未知的,应该根据运行时的数据来确定。如何达到预期效果?我已经尝试过Array[Array[Any]]和其他可能性。
提前致谢
问题在于 Any 的划分。该类型没有读取器,而 Scala 需要一个编译时间。您不能将其推迟到运行时。此问题有两种可能的解决方案:
-
您可以选择读取器存在的另一种类型,例如 JsValue。然后,该行变为:
val cValues = ((dataJson "CellValues").asOpt[List[List[JsValue]]]).get
-
您可以为"任何"类型提供读取器。示例代码段的读者如下所示:
implicit val anyReads = new Reads[Any] { def reads(json: JsValue): JsResult[Any] = json match { case JsString(s) => JsSuccess(s) case JsNumber(n) => JsSuccess(n.toLong) case _ => JsError() } } val cValues = ((dataJson "CellValues").asOpt[List[List[Any]]]).get
由于 anyReads 是隐式的,因此不必将其指定为 asOpt 方法的参数。