如何使用Scala获取json中所有元素的总和?

时间:2014-10-10 14:13:07

标签: json list scala

我跟随Json-

"disks" : [ {
    "name" : "v2.16",
    "diskAggregate" : "aggr0",
    "diskRPM" : 15000,
    "totalSizeBytes" : 1077477376,
    "vendorId" : "NETAPP  ",
    "usedBytes" : 1070071808,
    "diskType" : "FCAL",
    "uuid" : "4E455441:50502020:56442D31:3030304D:422D465A:2D353230:32353836:30303030:00000000:00000000",
    "portName" : "FC:A ",
    "raidGroup" : "rg0"
}, 
{
    "name" : "v4.16",
    "diskAggregate" : "aggr0",
    "diskRPM" : 15000,
    "totalSizeBytes" : 1077477376,
    "vendorId" : "NETAPP  ",
    "usedBytes" : 1070071808,
    "diskType" : "FCAL",
    "uuid" : "4E455441:50502020:56442D31:3030304D:422D465A:2D353230:32353633:34333030:00000000:00000000",
    "portName" : "FC:B ",
    "raidGroup" : "rg0"
}]

我想从json数组'disks'中的所有json对象中添加usedBytes。 我在Scala中使用fold进行了尝试,但没有获得所需的输出。 这是我的代码 -

val datastoreCapacity = disks
val usableSpace = datastoreCapacity.foldLeft(0L) {
    case (sumOfUsedSpace, esxDevice) =>
      val sumOfTotalBytesOnStorageDevice = esxDevice.datastores.foldLeft(0L) {
        case (totalBytesOnDevice, datastore) =>
         // totalBytesOnDevice + ut..getOrElse(0L).toString.toLong
        val sum = datastore.utilization.foldLeft(0L) {
          case (total,util) =>
            total + util.usedBytes.getOrElse(0L).toString.toLong
        }
      }
      sumOfUsedSpace + sumOfTotalBytesOnStorageDevice
  }

如何使用Scala获取已用字节总数?

1 个答案:

答案 0 :(得分:2)

假设磁盘是已解析对象的列表,其中一个名为usedBytes的getter返回选项为Long(如代码所示),这应该是:

disks.map(_.usedBytes).flatten.sum

一些解释:

  • 使用map我们使用给定的lambda函数(基本上只调用getter usedBytes)转换所有对象。

  • flatten过滤掉所有None个,并在列表中保留Some s的值。 (也可用于列表或向量列表等等。)

  • sum只是执行它所说的内容并构建数值集合的sum(我们从flatten得到的结果)


从您的评论中猜测我假设尽管上面的示例数据,磁盘具有属性利用率。我不知道它看起来是什么样的,它意味着什么,因为你的问题不清楚,但如果我认为它再次是一个带磁盘的列表。然后你可以做以下

disks.flatMap(_.utilization.map(_.usedBytes).flatten).sum

如果您不在寻找的位置,请指定您要处理的数据。