如何使用scala以特定格式获取数据?

时间:2014-10-08 12:41:08

标签: json scala scala-collections playframework-json

我有以下格式的原始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)
  } 

有人可以帮我获得所需的输出吗???

1 个答案:

答案 0 :(得分: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) }
  }

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