Json 到 Scala 类型 - 任何列表的列表



>我正在尝试解析包含数组数组的 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 方法的参数。

最新更新