Вопрос или проблема
Я написал спецификацию Jolt для следующего ввода. Она работает нормально для всех элементов, но для factPanel->nutrition->columns я не могу получить желаемый результат.
Все, что мне нужно сделать, это взять первый элемент json-колонок и вывести его в результат.
Мой ввод:
{
"upc": "9349125000405",
"brand": "BLUE DINOSAUR",
"distributor": null,
"importer": null,
"factPanel": {
"nutrition": {
"insignificantAmountStatement": null,
"labelStyle": "OLD_LABEL",
"columns": [
{
"name": "Per Serving",
"nutrients": [
{
"name": "Energy",
"valueOperator": "=",
"value": 1075.0,
"uom": "Cal",
"percentDvOperator": "=",
"percentDv": null
},
{
"name": "Protein",
"valueOperator": "=",
"value": 25.1,
"uom": "g",
"percentDvOperator": null,
"percentDv": null
}
]
},
{
"name": "PER 100 G",
"nutrients": [
{
"name": "Energy",
"valueOperator": "=",
"value": 1791.0,
"uom": "Cal",
"percentDvOperator": "=",
"percentDv": null
},
{
"name": "Protein",
"valueOperator": "=",
"value": 41.8,
"uom": "g",
"percentDvOperator": null,
"percentDv": null
}
]
}
]
}
}
}
Мой текущий вывод:
{
"li_panel": {
"values": [
{
"value": "Per Serving"
}
]
},
"li_nutrients": {
"values": [
{
"nutrientValue": "1075.0 Cal 1791.0 Cal",
"nutrientName": "Energy"
},
{
"nutrientValue": "25.1 g 41.8 g",
"nutrientName": "Protein"
}
]
}
}
Спецификация, которую я написал, такая:
[
{
"operation": "default",
"spec": {
"*": "RemoveNullValuedData",
"categorization": {
"*": "RemoveNullValuedData"
},
"gtinFormats": {
"gtin14": "RemoveNullValuedData"
},
"sizes": {
"*": {
"netWeight": {
"*": "RemoveNullValuedData"
}
}
},
"ingredients": {
"*": "RemoveNullValuedData"
},
"factPanel": {
"*": "RemoveNullValuedData",
"nutrition": {
"*": "RemoveNullValuedData",
"serving": {
"*": "RemoveNullValuedData"
},
"columns": {
"*": {
"name": "RemoveNullValuedData",
"nutrients": {
"*": {
"*": "RemoveNullValuedData"
}
}
}
}
}
},
"specs": {
"allergensAndIntolerances": {
"*": {
"allergensAndIntolerances_tempValue": "N/A",
"allergensAndIntolerancesFree_tempValue": "N/A"
}
},
"certification": {
"*": {
"value_lc": "N/A",
"characteristic_lc": "N/A",
"segment_lc": "N/A"
},
"halal_tempValue": "N/A"
},
"fdaNutrientContentClaims": {
"*": {
"value_lc": "N/A",
"characteristic_lc": "N/A"
}
},
"foodAndBeverageEssentials": {
"*": {
"value_lc": "N/A",
"characteristic_lc": "N/A",
"segment_lc": "N/A"
}
},
"specialtyDiets": {
"*": {
"value_lc": "N/A"
}
},
"productSustainability": {
"*": {
"value_lc": "N/A",
"characteristic_lc": "N/A",
"segment_lc": "N/A"
}
},
"isolatedFibers": {
"*": {
"value_lc": "N/A",
"characteristic_lc": "N/A"
}
},
"spicesAndHerbs": {
"*": {
"value_lc": "N/A",
"characteristic_lc": "N/A",
"segment_lc": "N/A"
}
}
}
}
},
{
"operation": "modify-default-beta",
"spec": {
"~gtinFormats": "",
"~factPanel": "",
"~li_serving_size": "",
"~li_serving_size_1": "",
"~li_nutrients": ""
}
},
{
"operation": "modify-overwrite-beta",
"spec": {
"*": "=recursivelySquashNulls",
"gtinFormats": {
"gtin12?": "=concat('00',@(1,gtin12))"
},
"factPanel": {
"nutrition": {
"serving": {
"size": "=concat(@(1,size),' ',@(1,sizeUom))",
"size2": "=concat(@(1,size2),' ',@(1,sizeUom2))"
}
}
},
"sizes": {
"*": {
"netWeight": {
"value": "=concat(@(1,value),' ',@(1,uom))"
}
}
}
}
},
{
"operation": "shift",
"spec": {
"gtin": {
"RemoveNullValuedData": null,
"*": {
"@1": "&2.values[].value"
}
},
"productTitle": {
"RemoveNullValuedData": null,
"*": {
"@1": "li_product_title.values[].value"
}
},
"productSize": {
"RemoveNullValuedData": null,
"*": {
"@1": "product_size.values[].value"
}
},
"manufacturer": {
"RemoveNullValuedData": null,
"*": {
"@1": "&2.values[].value"
}
},
"distributor": {
"RemoveNullValuedData": null,
"*": {
"@1": "&2.values[].value"
}
},
"importer": {
"RemoveNullValuedData": null,
"*": {
"@1": "&2.values[].value"
}
},
"subBrand": {
"RemoveNullValuedData": null,
"*": {
"@1": "&2.values[].value"
}
},
"variant": {
"RemoveNullValuedData": null,
"*": {
"@1": "variant_info.values[].value"
}
},
"gtinFormats": {
"gtin12": {
"00": null,
"*": {
"@1": "gtin.values[].value"
}
},
"gtin14": {
"RemoveNullValuedData": null,
"*": {
"@1": "gtin.values[].value"
}
}
},
"sizes": {
"*": {
"netWeight": {
"value": {
"RemoveNullValuedData": null,
" ": null,
"*": {
"@1": "weight.values[].value"
}
}
}
}
},
"ingredients": {
"declaration": {
"RemoveNullValuedData": null,
"*": {
"@1": "&2.values[].value"
}
},
"symbols": {
"*": {
"*": {
"@1": "&3.values[].value"
}
}
}
},
"factPanel": {
"nutrition": {
"insignificantAmountStatement": {
"RemoveNullValuedData": null,
"*": {
"@1": "&2.values[].value"
}
},
"serving": {
"numberPerPack": {
"RemoveNullValuedData": null,
"*": {
"@1": "li_serves_per_pack.values[].value"
}
},
"description": {
"RemoveNullValuedData": null,
"*": {
"@1": "li_serving_description.values[].value"
}
},
"size": {
"RemoveNullValuedData*": null,
"*RemoveNullValuedData": null,
" ": null,
"*": {
"@1": "li_serving_size.values[].value"
}
},
"size2": {
"RemoveNullValuedData*": null,
"*RemoveNullValuedData": null,
" ": null,
"*": {
"@1": "li_serving_size_1.values[].value"
}
}
},
"columns": {
"*": {
"name": "RemoveNullValuedData",
"nutrients": {
"*": {
"name": {
"Total Fat|Total Carbohydrate|Calories from Sat Fat Percent|Calories from Sugar Percent|Calories from Fat Percent|Sodium Per Calorie|Carbohydrate Exchange|Calories from Carbohydrate": null,
"*": {
"@(2,name)": "li_nutrients.values[&3].nutrientName",
"@(2,percentDvOperator)": {
"=": {
"@(4,percentDv)": "li_nutrients.values[&5].nutrientPercentageDailyValue"
},
"*": {
"@(4,percentDvOperator)|@(4,percentDv)": "li_nutrients.values[&5].nutrientPercentageDailyValue"
}
},
"@(2,valueOperator)": {
"=": {
"@(4,value)|@(4,uom)": "li_nutrients.values[&5].nutrientValue"
}
}
}
}
}
}
}
}
}
},
"specs": {
"allergensAndIntolerances": {
"*": {
"allergensAndIntolerances_tempValue": {
"not applicable": null,
"": null,
"*": {
"@(2,allergensAndIntolerancesFree_tempValue)": {
"\\ free": {
"@(4,value)": "li_allergensfreestatement.values[].value"
},
"* free": {
"@(4,value)": "li_allergensfreestatement.values[].value"
},
"*": {
"@(4,value)": "li_allergensandintolerances.values[].value"
}
}
}
}
}
},
"ahaStandardCertification": {
"*": {
"segment": {
"AHA Heart Check Certification": {
"@(2,value)": {
"AHA Heart Healthy Certified": {
"#American Heart Association": "li_hearthealthycertifications.values[].value"
}
}
}
}
}
},
"fdaNutrientContentClaims": {
"*": {
"characteristic_lc": {
"unsalted": null,
"*": {
"@(2,value_lc)": {
"not applicable": null,
"*": {
"@(4,value)": "li_nutritionalclaims.values[].value"
}
}
}
}
}
}
}
}
},
{
"operation": "modify-overwrite-beta",
"spec": {
"li_panel": {
"values": {
"*": {
"value": "=firstElement"
}
}
},
"li_nutrients?": {
"values": {
"*": {
"nutrientName":"=firstElement",
"nutrientValue":"=join(' ',@(1,&))",
"nutrientPercentageDailyValue": "=join(' ',@(1,&))"
}
}
},
"weight?": {
"values": {
"*": {
"value": "=trim"
}
}
},
"li_serving_size?": {
"values": {
"*": {
"value": "=trim"
}
}
},
"li_serving_size_1?": {
"values": {
"*": {
"value": "=trim"
}
}
},
"li_halal?": {
"values": {
"*": {
"value": "=firstElement",
"isDiscoveryAttribute": "=firstElement"
}
}
},
"li_grassfed?": {
"values": {
"*": {
"value": "=firstElement",
"isDiscoveryAttribute": "=firstElement"
}
}
},
"li_pectin?": {
"values": {
"*": {
"value": "=firstElement",
"isDiscoveryAttribute": "=firstElement"
}
}
},
"li_sesame?": {
"values": {
"*": {
"value": "=firstElement",
"isDiscoveryAttribute": "=firstElement"
}
}
},
"*": "=recursivelySquashNulls"
}
}
]
Но я хочу получить вывод, как показано ниже:
{
"li_panel": {
"values": [
{
"value": "Per Serving"
}
]
},
"li_nutrients": {
"values": [
{
"nutrientValue": "1075.0 Cal",
"nutrientName": "Energy"
},
{
"nutrientValue": "25.1 g",
"nutrientName": "Protein"
}
]
}
}
В li_nutrients я хочу населить только значение columns[0]. Пожалуйста, помогите мне изменить спецификацию. Спасибо заранее.
PS: Я сократил ввод и вывод, чтобы были только актуальные данные.
Вы можете использовать shift и за ним modify спецификации, такие как
[
{ //обратите внимание на переименования
"operation": "shift",
"spec": {
"factPanel": {
"nutrition": {
"columns": {
"0": { //потому что вы хотите взять первый элемент
"name": "li_panel[0].values[0].value",
"nutrients": {
"*": {
"value|uom": "li_&2.values[&1].nutrientValue",
"name": "li_&2.values[&1].nutrientNames"
}
}
}
}
}
}
}
},
{//объедините компоненты массивов и сделайте их парами ключ-значение
"operation": "modify-overwrite-beta",
"spec": {
"*": {
"*": {
"*": {
"*": "=join(' ',@(1,&))" // оставьте один пробел между компонентами
}
}
}
}
}
]
Демо на сайте Jolt Transform Demo Using v0.1.1 это :
Ответ или решение
Чтобы создать правильную спецификацию Jolt (Jolt Spec) для преобразования входных данных в требуемый выход, вам нужно фокусироваться на извлечении первого элемента из массива columns
внутри factPanel -> nutrition
. Ниже приведена исправленная спецификация, которая делает именно это.
Входные данные
Ваши входные данные следующие:
{
"upc": "9349125000405",
"brand": "BLUE DINOSAUR",
"factPanel": {
"nutrition": {
"columns": [
{
"name": "Per Serving",
"nutrients": [
{
"name": "Energy",
"value": 1075.0,
"uom": "Cal"
},
{
"name": "Protein",
"value": 25.1,
"uom": "g"
}
]
},
{
"name": "PER 100 G",
"nutrients": [
{
"name": "Energy",
"value": 1791.0,
"uom": "Cal"
},
{
"name": "Protein",
"value": 41.8,
"uom": "g"
}
]
}
]
}
}
}
Требуемый выход
Вы желаете получить следующий выход:
{
"li_panel": {
"values": [
{
"value": "Per Serving"
}
]
},
"li_nutrients": {
"values": [
{
"nutrientValue": "1075.0 Cal",
"nutrientName": "Energy"
},
{
"nutrientValue": "25.1 g",
"nutrientName": "Protein"
}
]
}
}
Jolt Spec
Вот спецификация Jolt, которая может быть использована для достижения желаемого результата:
[
{
"operation": "shift",
"spec": {
"factPanel": {
"nutrition": {
"columns": {
"0": { // Получаем только первый элемент
"name": "li_panel.values[0].value",
"nutrients": {
"*": {
"name": "li_nutrients.values[][nutrientName]",
"value": "li_nutrients.values[][nutrientValue]",
"uom": "li_nutrients.values[][nutrientValue]" // Объединяем значение и единицу измерения
}
}
}
}
}
}
}
},
{
"operation": "modify-overwrite-beta",
"spec": {
"li_nutrients": {
"values": {
"*": {
"nutrientValue": "=concat(@(2,value),' ',@(2,uom))" // Объединяем значение и единицу измерения
}
}
}
}
}
]
Объяснение спецификации:
-
Shift:
- Мы используем
operation
: "shift", чтобы выбрать первый элемент массиваcolumns
(с индексом0
). - Имя первого элемента (
name
) переносится вli_panel
. - Все питательные вещества (
nutrients
) из первого столбца также переносятся вli_nutrients
, сохраняя имя и значение каждого питательного вещества.
- Мы используем
-
Modify-Overwrite-Beta:
- На втором этапе мы собираем значение и единицу измерения каждого питательного вещества в одно поле
nutrientValue
.
- На втором этапе мы собираем значение и единицу измерения каждого питательного вещества в одно поле
Эта спецификация должна помочь вам получить желаемый выход. Если у вас есть дополнительные вопросы, пожалуйста, дайте знать.