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 に答える