Измените поле json в элементе массива, только если условие истинно

все. Я пытаюсь изменить значение поля в элементе массива в json с условием: если значение «field1» равно «value1», то измените значение поля «changethisfield» на «new_value». Текущая полезная нагрузка:

    {
      "message": [
        {
          "field1": "value1",
          "field2": "value2",
          "changethisfield": ""
        },
        {
          "field1": "value3",
          "field2": "value4",
          "changethisfield": ""
        }
      ]
    }

Код Dataweave:

    %dw 2.0
    output application/json

    var itemValue = payload.message map (item) -> {
        (item mapObject (value, key, index) -> {
            ((key): value) if (key as String != 'changethisfield'),
            (changethisfield: "new_value") if (key as String == 'changethisfield')
        })
    }

    ---

    {
        "message": {
            item: itemValue
        }
    }

Но этот код меняет значение во всех элементах массива (текущий вывод):

{
  "message": {
    "item": [
      {
        "field1": "value1",
        "field2": "value2",
        "changethisfield": "new_value"
      },
      {
        "field1": "value3",
        "field2": "value4",
        "changethisfield": "new_value"
      }
    ]
  }
}

Желаемый результат (только значение элемента «changethisfield», где «field1» содержит «value1», должно измениться на «new_value»):

{
  "message": {
    "item": [
      {
        "field1": "value1",
        "field2": "value2",
        "changethisfield": "new_value"
      },
      {
        "field1": "value3",
        "field2": "value4",
        "changethisfield": ""
      }
    ]
  }
}

Помогите, пожалуйста, понять, как я могу ставить условия в элементах массива и решать эту задачу. Спасибо!


person Community    schedule 25.03.2020    source источник


Ответы (2)


Хотел добавить, что вы также можете использовать функцию update вместо удаления повторного добавления поля к объекту вручную. Это сработает, чтобы изменить каждый элемент в массиве на определенное значение, но поскольку у вас есть условие, вы должны выполнить его внутри карты.

Проблема с вашим сравнением заключается в том, что вы выполняли сравнение на уровне объекта и только в том случае, если ключ был определенной строкой. Вы не проверяете, имеет ли field1 определенное значение или нет.

%dw 2.0
output application/json
import * from dw::util::Values

var inputData =     {
      "message": [
        {
          "field1": "value1",
          "field2": "value2",
          "changethisfield": ""
        },
        {
          "field1": "value3",
          "field2": "value4",
          "changethisfield": ""
        }
      ]
    }

---
{
    message: inputData.message map ((item, index) -> (
        if (item.field1 == "value1") (
            item update "changethisfield" with "newValue"
        ) else (
            item
        )
    ))
}
person maddestroyer7    schedule 25.03.2020

Это должно работать:

%dw 2.0
output application/dw

var data =     {
      "message": [
        {
          "field1": "value1",
          "field2": "value2",
          "changethisfield": ""
        },
        {
          "field1": "value3",
          "field2": "value4",
          "changethisfield": ""
        }
      ]
    }

---
message: data.message map {
    ($ - "changethisfield"),
    changethisfield: if ($.field1 == "value1") "new_value" else $.changethisfield
}
person George    schedule 25.03.2020