1

我有以下格式的原始 json-

"luns": [
{
  "numReadBlocks": 15444876,
  "numWriteBlocks": 13530714,
  "blockSizeInBytes": 512,
  "writeIops": 495344,
  "readIops": 312702,
  "serialNumber": "aaaaaaa",
  "uuid": "id",
  "shareState": "none",
  "usedBytes": 6721716224,
  "totalSizeBytes": 16106127360,
  "path": "/vol/lun_23052014_025830_vol/lun_23052014_025830"
},
{
  "numReadBlocks": 15444876,
  "numWriteBlocks": 13530714,
  "blockSizeInBytes": 512,
  "writeIops": 495344,
  "readIops": 312702,
  "serialNumber": "aaaaaaa",
  "uuid": "id",
  "shareState": "none",
  "usedBytes": 6721716224,
  "totalSizeBytes": 16106127360,
  "path": "/vol/lun_23052014_025830_vol/lun_23052014_025830"
 }]

luns 可能包含列表。我想处理上面的json并形成如下输出 -

"topStorageLuns": [
{
    "name": "Free (in GB)",
    "data": [7.79,7.79]
},
{
    "name": "Used (in GB)",
    "data": [7.21,7.21]
}]

我尝试跟随以获得输出-

val storageLuns = myRawJson
val topStorageLuns = storageLuns.map { storageLun =>
    val totalLunsSizeOnStorageDevice = storageLun.luns.foldLeft(0.0) {
      case (totalBytesOnDevice, lun) =>
        totalBytesOnDevice + lun.usedBytes.getOrElse(0.0).toString.toLong
    }
    val totalAvailableLunsOnStorageDevice = storageLun.luns.foldLeft(0.0) {
      case (totalBytesOnDevice, lun) =>
        totalBytesOnDevice + lun.usedBytes.getOrElse(0.0).toString.toLong
    }

    Json.obj("name" -> storageLun.hostId, "data" -> "%.2f".format(totalLunsSizeOnStorageDevice / (1024 * 1024 * 1024)).toDouble)
  } 

任何人都可以帮我获得所需的输出吗???

4

1 回答 1

2

我想传授的关键教训是你的算法应该反映你想要的输出的形状。从您要构建算法的结果向后工作。

在我看来,您想创建一个长度为 2 的数组,其中每个条目都有一个相应的算法(已使用间隔,无空间)。在每个元素中,您需要一个嵌套数组,其中输入数组中的每个项目都有一个元素,使用外部数组中的算法计算。这是我解决问题的方法:

1) 定义你的算法

  val dfAlgorithm: (Seq[(String, JsValue)] => Double) = _.foldLeft(0.0) { (acc, item) =>
    /* whatever logic you need to do */
  }

  val duAlgorithm: (Seq[(String, JsValue)] => Double) = _.foldLeft(0.0) { (acc, item) =>
    /* whatever logic you need to do */
  }

2)创建一个数据结构来映射以构建您的最终输出

  val stats = Seq("Free (in GB)" -> dfAlgorithm, "Used (in GB)" -> duAlgorithm)

3)在您的算法映射中映射您的输入数据(这里的逻辑反映了您想要的结果的形状)

  stats.map { case (name, algorithm) =>
    Json.obj("name" -> name, "data" -> storageLuns.map { storageLun => algorithm(storageLun) }
  }

这不会是一个交钥匙解决方案,因为我不知道你的免费/使用算法应该如何工作,但这个整体方案应该能让你到达那里。

于 2014-10-08T13:37:15.270 回答