Объединение частей json в scala

#json #scala

#json #scala

Вопрос:

Я недавно начал работать над scala и работать с json. У меня есть следующий json.

 {
  "town": {
    "address": {
      "Dates": [
        {
          "startDate": "2019-06-01"
        }
      ],
      "condtion": {
        "includeAll": [
          {
            "type": "location",
            "id": "AB1234",
            "details": [
              {
                "destination": "London"
              }
            ]
          },
          {
            "type": "area",
            "id": "CD1234",
            "details": [
              {
                "value": "Any"
              }
            ]
          },
          {
            "type": "area",
            "id": "CD1234",
            "details": [
              {
                "value": "12345"
              }
            ]
          },
        ]
      }
      "FinalId": "N9"
    }
  }
}
  

Я должен написать код на scala таким образом, чтобы детали с одинаковыми идентификаторами были объединены. Например, для id CD1234 мой окончательный json должен выглядеть следующим образом.

 {
  "town": {
    "address": {
      "Dates": [
        {
          "startDate": "2019-06-01"
        }
      ],
      "condtion": {
        "includeAll": [
          {
            "type": "location",
            "id": "AB1234",
            "details": [
              {
                "destination": "London"
              }
            ]
          },
          {
            "type": "area",
            "id": "CD1234",
            "details": [
              {
                "value": "Any"
              },
              {
                "value": "12345"
              }
            ]
          }
        ]
      }
      "FinalId": "N9"
    }
  }
}
  

В приведенном выше json details массив для идентификатора CD1234 объединен, и доступно только одно условие с идентификатором CD1234. Как я могу это сделать в scala?

Ответ №1:

Ниже показано, как это можно сделать с помощью библиотеки Dijon:

 import scala.language.dynamics._
import com.github.pathikrit.dijon._

val jsonString = """
                   |{
                   |  "town": {
                   |    "address": {
                   |      "Dates": [
                   |        {
                   |          "startDate": "2019-06-01"
                   |        }
                   |      ],
                   |      "condition": {
                   |        "includeAll": [
                   |          {
                   |            "type": "location",
                   |            "id": "AB1234",
                   |            "details": [
                   |              {
                   |                "destination": "London"
                   |              }
                   |            ]
                   |          },
                   |          {
                   |            "type": "area",
                   |            "id": "CD1234",
                   |            "details": [
                   |              {
                   |                "value": "Any"
                   |              }
                   |            ]
                   |          },
                   |          {
                   |            "type": "area",
                   |            "id": "CD1234",
                   |            "details": [
                   |              {
                   |                "value": "12345"
                   |              }
                   |            ]
                   |          }
                   |        ]
                   |      },
                   |      "FinalId": "N9"
                   |    }
                   |  }
                   |}
                   |""".stripMargin
val input = parse(jsonString)
val output = input.deepCopy
output.town.address.condition.includeAll = arr(input.town.address.condition.includeAll.toSeq.groupBy(_.id).values.map { x =>
  val y = x.head.deepCopy
  y.details = arr(x.flatMap(_.details.toSeq).toArray:_*)
  y
}.toArray:_*)
print(pretty(output))
  

Ожидаемый результат:

 {
  "town": {
    "address": {
      "Dates": [
        {
          "startDate": "2019-06-01"
        }
      ],
      "condition": {
        "includeAll": [
          {
            "type": "area",
            "id": "CD1234",
            "details": [
              {
                "value": "Any"
              },
              {
                "value": "12345"
              }
            ]
          },
          {
            "type": "location",
            "id": "AB1234",
            "details": [
              {
                "destination": "London"
              }
            ]
          }
        ]
      },
      "FinalId": "N9"
    }
  }
}