Как анализировать глубоко вложенный JSON в Scala с помощью Monocle (Lens)

Я читал пример того, как использовать монокль для глубокого анализа некоторых jsons, но этот пример довольно прямолинейный, но у меня есть более сложный вид, который выглядит так:

      {
"products": {
  "HY3BZPP2B6K8MSJF" : {
    "sku" : "HY3BZPP2B6K8MSJF",
    "productFamily" : "Storage",
    "attributes" : {
        "servicecode" : "AmazonEC2",
        "location" : "US East (N. Virginia)",
        "locationType" : "AWS Region",
        "storageMedia" : "SSD-backed",
        "volumeType" : "General Purpose",
        "maxVolumeSize" : "16 TiB",
        "maxIopsvolume" : "16000",
        "maxIopsBurstPerformance" : "3000 for volumes <= 1 TiB",
        "maxThroughputvolume" : "250 MiB/s",
        "usagetype" : "EBS:VolumeUsage.gp2",
        "operation" : "",
        "servicename" : "Amazon Elastic Compute Cloud",
        "volumeApiName" : "gp2"
    }
  },
  ...
 },
 "terms" : {
   "OnDemand" : {
      "HY3BZPP2B6K8MSJF" : {
         "HY3BZPP2B6K8MSJF.JRTCKXETXF" : {
           "offerTermCode" : "JRTCKXETXF",
           "sku" : "HY3BZPP2B6K8MSJF",
           "effectiveDate" : "2021-10-01T00:00:00Z",
           "priceDimensions" : {
              "HY3BZPP2B6K8MSJF.JRTCKXETXF.6YS6EN2CT7" : {
                "rateCode" : "HY3BZPP2B6K8MSJF.JRTCKXETXF.6YS6EN2CT7",
                "description" : "$0.10 per GB-month of General Purpose SSD (gp2) provisioned storage - US East (Northern Virginia)",
                "beginRange" : "0",
                "endRange" : "Inf",
                "unit" : "GB-Mo",
                "pricePerUnit" : {
                    "USD" : "0.1000000000"
                },
                "appliesTo" : [ ]
            }
        },
        "termAttributes" : { }
    }
 },
 ...
}

Я могу разобрать его, используя следующий код:

      val productData = productConnector.getProducts(100).map(p => Serializer.fromJson[ProductInfo](p))

но я не знаю, как написать линзу, чтобы я мог создать карту с «volumeApiName» и «pricePerUnit», что-то вроде (gp2 -> 0.1000000000), обратите внимание, что «volumeApiName» имеет «sku», который может его использовать чтобы позже сопоставить "условия". "OnDemand"., а затем углубиться в pricePerUnit.

0 ответов

Другие вопросы по тегам