Как объединить JSON с помощью JMESPATH?
Дело в том, что у меня JSON выглядит примерно так:
{
"country": "USA",
"states": [
{
"stateName": "California",
"timeZone": "UTC-8",
"cities": [
{
"cityName": "Los Angeles"
},
{
"cityName": "San Diego"
}
]
},
{
"stateName": "Texas",
"timeZone": "UTC-8",
"cities": [
{
"cityName": "Houston"
},
{
"cityName": "Dallas"
}
]
}
]
}
(этот JSON - просто пример, не принимайте это всерьез)
Что мне нужно сделать, это перечислить все города, но также взять поле "stateName" у родителя и каким-то образом поместить его в объект city, что приведет к чему-то вроде этого:
[
{
"stateName": "California",
"cityName": "Los Angeles"
},
{
"stateName": "Texas",
"cityName": "Houston"
},
{
"stateName": "Texas",
"cityName": "Dallas"
},
{
"stateName": "California",
"cityName": "San Diego"
}
]
Я пытался использовать встроенную функцию слияния несколькими различными способами, но мне не удалось получить никаких результатов, кроме того, документация по этой функции не очень интуитивно понятна.
одна из моих неудачных попыток:
merge(`states[].cities[]`, `states[].{stateName: stateName}`)
Есть идеи?
Заранее спасибо.
1 ответ
Вы не можете сделать это с помощью jmespath. Проверьте это: https://github.com/jmespath/jmespath.js/issues/22
Тем не менее, вы можете сделать что-то вроде этого сейчас:
states[].{stateName: stateName, cities: cities[].cityName}[]
привести к выводу, как:
[
{
"stateName": "California",
"cities": [
"Los Angeles",
"San Diego"
]
},
{
"stateName": "Texas",
"cities": [
"Houston",
"Dallas"
]
}
]
Я нашел решение, но вам нужно ввести жестко запрограммированное значение, вот запрос:
states[].{stateName: stateName, cities: cities[]}[] | @[*].{stateName: {stateName: stateName}, cities: cities} | @[*].[merge(stateName,cities[0]),merge(stateName,cities[1])][]
это дает:
[
{
"stateName": "California",
"cityName": "Los Angeles"
},
{
"stateName": "California",
"cityName": "San Diego"
},
{
"stateName": "Texas",
"cityName": "Houston"
},
{
"stateName": "Texas",
"cityName": "Dallas"
}
]