2014-10-10 48 views
1

我有以下Json-如何使用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" 
}] 

我想除了usedBytes的从JSON数组“盘”的所有JSON对象。 我在Scala中试过了它,但没有得到期望的输出结果。 这里是我的代码 -

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的使用的字节?

回答

2

假设磁盘是一个getter称为usedBytes返回长(如代码提示)的选项已经被解析的对象的列表,这应该这样做:

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

一些解释:

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

  • flatten过滤掉所有None s并在列表中保留Some s的值。

  • sum只是做它说什么(也可在列表的列表或向量等等,等等的阵列中使用),并建立数字值的集合的sum(我们得到来自flatten结果)


从您的评论猜我认为,尽管你上面的例子数据,磁盘有一个属性的利用率。我不知道这是什么样子,它是什么意思,因为你的问题不清楚,但如果我认为它又是一个磁盘列表。然后,你可以做以下

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

请注明您想要的数据处理,如果这不是您要寻找的。

+0

它将只遍历数据存储..如何访问“利用率”内的关键? – Vishwas 2014-10-10 16:06:44

+0

@Vish你是什么意思的'利用'?如果你想完整的答案,你应该发布数据模型类 – roterl 2014-10-11 06:25:57

+0

@Vishwas看我的编辑 – 2014-10-12 18:43:13

相关问题