#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"
}
}
}