Какой должен быть правильный спецификации джолта для следующего вывода?

Вопрос или проблема

Я написал спецификацию 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))" // Объединяем значение и единицу измерения
          }
        }
      }
    }
  }
]

Объяснение спецификации:

  1. Shift:

    • Мы используем operation: "shift", чтобы выбрать первый элемент массива columns (с индексом 0).
    • Имя первого элемента (name) переносится в li_panel.
    • Все питательные вещества (nutrients) из первого столбца также переносятся в li_nutrients, сохраняя имя и значение каждого питательного вещества.
  2. Modify-Overwrite-Beta:

    • На втором этапе мы собираем значение и единицу измерения каждого питательного вещества в одно поле nutrientValue.

Эта спецификация должна помочь вам получить желаемый выход. Если у вас есть дополнительные вопросы, пожалуйста, дайте знать.

Оцените материал
Добавить комментарий

Капча загружается...