Я пытаюсь объединить несколько JSON массивов в один массив свернутых, как ключевые значения. Вот к чему я получил код:
[
{
"projectId": 35525710,
"jobs": [
{
"targetLanguage": "zh_CN",
"jobId": 35826845,
"earlyAccessStatus": "NOT_STARTED"
},
{
"targetLanguage": "pt_BR",
"jobId": 35826846,
"earlyAccessStatus": "IN_PROGRESS"
},
{
"targetLanguage": "zh_CN",
"jobId": 35826836,
"earlyAccessStatus": "IN_PROGRESS"
},
{
"targetLanguage": "pt_BR",
"jobId": 35826837,
"earlyAccessStatus": "IN_PROGRESS"
}
]
}
]
Желаемый результат будет: ( Отредактировано ниже для выбора другого маршрута )
[
{
"projectId": 35525710,
"jobs": [
{
"targetLanguage": "zh_CN",
"jobIds": [35826845,35826836],
"earlyAccessStatus": ["NOT_STARTED","IN_PROGRESS"]
},
{
"targetLanguage": "pt_BR",
"jobIds": [35826846,35826837],
"earlyAccessStatus": ["IN_PROGRESS"]
}
]
}
]
Я не совсем уверен, что произойдет с дублированными значениями ключа .earlyAccessStatus
, будь то ["IN_PROGRESS","IN_PROGRESS"]
или ["IN_PROGRESS"]
. Последнее удовлетворяет мои возможные потребности, которые заключаются в получении значения .targetLanguage
для любого языка, чей единственный .earlyAccessStatus
- ["IN_PROGRESS"]
.
Используя этот фильтр с параметром jq -r
, я могу вытащить Значение .targetLanguage
для любых языков, у которых только .earlyAccessStatus
равно ["IN_PROGRESS"]
. Любая помощь будет принята с благодарностью!
.[].jobs[] | select(.[] | .earlyAccessStatus == ["IN_PROGRESS"] ) | .[] | .targetLanguage
Обновление: вот как выглядит необработанный JSON до того, как я что-то манипулировал. Я не привязан к какому-либо конкретному c методу. Я пытаюсь собрать данные о проекте с различными заданиями и изолировать языки, для которых все связанные задания достигли определенного шага (целевой файл export1), как указано «IN_PROGRESS». Если у языка есть одно задание на другом шаге, как, например, в zh_CN ниже, то этот язык не готов и не должен проходить через фильтр.
Чтобы получить вывод выше, я сделал это насколько (с одним обновлением, сделанным для устранения избыточных массивов внутри «заданий», уже предложенных, и я заранее извиняюсь за любую попытку Франкенштейна по разделению строк, которую вы видите в команде jq):
. | [{"projectId": .projectId,
"jobs": [( .jobs[] |
{ "targetLanguage": .targetLanguage,
"jobId": .jobId,
"earlyAccessStatus": (.steps[] | select(.workflowStepName == "Target file export1") | .status) } )] }]
Raw JSON:
{
"projectId": 35902499,
"completionStatus": "IN_PROGRESS",
"activity": "ACTIVE",
"sourceLanguage": "en_US",
"jobs": [
{
"jobId": 35902526,
"completionStatus": "IN_PROGRESS",
"targetLanguage": "pt_BR",
"steps": [
{
"workflowStepName": "Project Intake and Quote Generation1",
"status": "FINISHED"
},
{
"workflowStepName": "Translate1",
"status": "FINISHED"
},
{
"workflowStepName": "Correct1",
"status": "FINISHED"
},
{
"workflowStepName": "Segment greenification1",
"status": "FINISHED",
"autoStatus": "SUCCESS"
},
{
"workflowStepName": "Target file export1",
"status": "IN_PROGRESS"
}
]
},
{
"jobId": 35902516,
"completionStatus": "IN_PROGRESS",
"targetLanguage": "zh_CN",
"steps": [
{
"workflowStepName": "Project Intake and Quote Generation1",
"status": "FINISHED"
},
{
"workflowStepName": "Translate1",
"status": "FINISHED"
},
{
"workflowStepName": "Correct1",
"status": "FINISHED"
},
{
"workflowStepName": "Segment greenification1",
"status": "FINISHED",
"autoStatus": "SUCCESS"
},
{
"workflowStepName": "Target file export1",
"status": "IN_PROGRESS"
}
]
},
{
"jobId": 36433561,
"completionStatus": "IN_PROGRESS",
"targetLanguage": "pt_BR",
"steps": [
{
"workflowStepName": "Project Intake and Quote Generation1",
"status": "FINISHED"
},
{
"workflowStepName": "Translate1",
"status": "FINISHED"
},
{
"workflowStepName": "Correct1",
"status": "FINISHED"
},
{
"workflowStepName": "Segment greenification1",
"status": "FINISHED",
"autoStatus": "SUCCESS"
},
{
"workflowStepName": "Target file export1",
"status": "IN_PROGRESS"
}
]
},
{
"jobId": 36433560,
"completionStatus": "IN_PROGRESS",
"targetLanguage": "zh_CN",
"steps": [
{
"workflowStepName": "Project Intake and Quote Generation1",
"status": "FINISHED"
},
{
"workflowStepName": "Translate1",
"status": "FINISHED"
},
{
"workflowStepName": "Correct1",
"status": "FINISHED"
},
{
"workflowStepName": "Segment greenification1",
"status": "FINISHED",
"autoStatus": "SUCCESS"
},
{
"workflowStepName": "Target file export1",
"status": "IN_PROGRESS"
}
]
},
{
"jobId": 36433552,
"completionStatus": "IN_PROGRESS",
"targetLanguage": "pt_BR",
"steps": [
{
"workflowStepName": "Project Intake and Quote Generation1",
"status": "FINISHED"
},
{
"workflowStepName": "Translate1",
"status": "FINISHED"
},
{
"workflowStepName": "Correct1",
"status": "FINISHED"
},
{
"workflowStepName": "Segment greenification1",
"status": "FINISHED",
"autoStatus": "SUCCESS"
},
{
"workflowStepName": "Target file export1",
"status": "IN_PROGRESS"
}
]
},
{
"jobId": 36433551,
"completionStatus": "IN_PROGRESS",
"targetLanguage": "zh_CN",
"steps": [
{
"workflowStepName": "Project Intake and Quote Generation1",
"status": "FINISHED"
},
{
"workflowStepName": "Translate1",
"status": "FINISHED"
},
{
"workflowStepName": "Correct1",
"status": "IN_PROGRESS"
},
{
"workflowStepName": "Segment greenification1",
"status": "NOT_STARTED"
},
{
"workflowStepName": "Target file export1",
"status": "NOT_STARTED"
}
]
}
]
}
Новый подход
Сага продолжается. Я так близко подошел, выбрав другой маршрут.
.[].jobs |
map({targetLanguage: .targetLanguage,
earlyAccess: {
jobId: .jobId,
earlyAccessStatus: .earlyAccessStatus}})
| group_by(.targetLanguage)
| map({targetLanguage: .[0].targetLanguage,
jobId: map(.jobId) | unique,
earlyAccessStatus: map(.earlyAccessStatus) | unique})
Это дает мне в основном именно тот вывод, который я хочу, за исключением недостающих данных, которые мне нужны, что, я полагаю, является неудачей:
[
{
"targetLanguage": "pt_BR",
"jobId": [
null
],
"earlyAccessStatus": [
null
]
},
{
"targetLanguage": "zh_CN",
"jobId": [
null
],
"earlyAccessStatus": [
null
]
}
]
В идеале, вместо этого это вывело бы уникальные значения, содержащиеся в ключах jobId и earlyAccessStatus, например:
[
{
"targetLanguage": "pt_BR",
"jobId": [
35826846, 35826837
],
"earlyAccessStatus": [
"IN_PROGRESS"
]
},
{
"targetLanguage": "zh_CN",
"jobId": [
35826845, 35826836
],
"earlyAccessStatus": [
"IN_PROGRESS", "NOT_STARTED"
]
}
]
Это позволило бы мне легко фильтровать targetLanguage
согласно earlyAccessStatus == ["IN_PROGRESS"]
.