0
votes

Mule Dataweave - Ajouter des attributs simples et simples

Je dois ajouter de nouveaux attributs (simples et imbriqués) à une charge utile JSON existante à l'aide de Dataweave (3.0). Je poste la charge utile de l'échantillon ci-dessous: xxx

dans la charge utile ci-dessus, j'ai besoin d'ajouter un nouvel attribut ("STATTECODE": "NULL") à Orgaddr.MainAddr et également un nouvel attribut appelé "drapeau": "oui", après orgaddr. Je peux ajouter le nouvel attribut "drapeau" à la fin, mais comment puis-je modifier un attribut imbriqué (ORGADDR). Veuillez noter que j'ai besoin d'ajouter les attributs simples et imbriqués ensemble.


0 commentaires

3 Réponses :


3
votes

cas d'utilisation très intersable. J'ai pu le résoudre en créant deux fonctions d'aide qui me permet de mettre à jour les champs.

%dw 2.0
output application/json

/**
 * Updates the value of the specified field If the field doesn't exits it will be inserted at the bottom. Use this function with `with`. The with will receive the old value
 */
fun update(objectValue: Object, fieldName: String) = 
    (newValueProvider: (oldValue: Any, index: Number) -> Any) -> do {
        if(objectValue[fieldName]?)
            objectValue mapObject ((value, key, index) -> 
                if(key ~= fieldName)
                    {(key): newValueProvider(value, index)}
                else
                {(key): value}
            )
        else
            objectValue ++ {(fieldName): newValueProvider(null, 0)}
    }

/**
 * Updates the value at the specified index. If the index is bigger than the size it will be appended. Use this function with `with`. The with will receive the old value
 */
fun update(arrayValue: Array, indexToUpdate: Number) = 
    (newValueProvider: (oldValue: Any, index: Number) -> Any) -> do {
        if(arrayValue[indexToUpdate]?)
            arrayValue map ((value, index) -> 
                if(index == indexToUpdate)
                    newValueProvider(value, index)
                else
                    value
            )
        else
            arrayValue << newValueProvider(null, 0)
    }

---
payload update "entities" with (
    $ update 0 with (
        $ update "sourceEnt" with (
            $ update "entity" with (
                $ update "OrgAddr" with (
                        $ map ((item, index) -> item update "MainAddr" with ($ ++ {"StateCode": null}) )
                ) ++ {
                    "Flag" : "yes"
                }
            )
        )
    )
)


6 commentaires

Merci d'avoir répondu. Je suis sur Mule 3.9 et% DW 1.0. Est-ce que ça va marcher? Je vais essayer de toute façon.


Ce serait génial si vous pouvez poster les fonctions équivalentes% DW 1.0


Comment ces fonctions de mise à jour se comparent-elles à la fonction de mise à jour publiée dans l'opérateur de mise à jour DW 2.3. Et est-il implémenté comme un "opérateur" ou une fonction comme il est montré ici? Je suis également confondu sur la syntaxe "avec" montré. Peut-il être utilisé avec une fonction DW?


La syntaxe sur 2.3 aura le type d'inférence et d'une assistance d'outils sur les expressions de sélecteur. Et est moins verbeux.


Mise à jour de la charge utile {Entité de cas AT.entities [0] .Sourceent.entity -> Do {ADTTY Mettre à jour {Adresses de cas sur .Orgaddr -> DO {ADRESSES MAP ((ADDR, Index) -> ADDR Mise à jour {Case. Mainddr.stateCode! -> null})} cas .flag! -> "oui"}}}


Oh, je l'ai eu, alors nous n'avons pas à utiliser la syntaxe "avec"? Je suis toujours confondu dans cette version comment "avec" est utilisé.



2
votes

Vous pouvez essayer ceci:

 %dw 1.0
    %output application/json
    %var pay=flatten payload.entities.sourceEnt.entity.OrgAddr
    ---
     {(pay)} mapObject {
            ($$):$ when ($$ as :string) != "MainAddr" otherwise {"StateCode": "null"} ++ $
        }


0 commentaires

3
votes

Réponse de la version 2.3 de Dataweave

payload update {
    case entity at.entities[0].sourceEnt.entity -> do {
         entity update {
            case addresses at .OrgAddr ->  do {
            addresses map ((addr, index) -> addr  update {
                    case .MainAddr.StateCode! ->  null
            })
            }
            case .Flag! -> "Yes"
         }
    }
}


0 commentaires