2014-10-10 50 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

相關問題