2
votes

Comment transformer les noms d'objets JSON en nom d'élément? Supprimer également un objet imbriqué?

En utilisant Dataweave, j'essaye de transformer ceci:

[
{
    "name":"ConcurrentAsyncGetReportInstances",
    "max":200,
    "remaining":200 
},
{
    "name":"ConcurrentSyncReportRuns",
    "max":"20",
    "remaining":"20"    
},
{
    "name":"DailyAnalyticsDataflowJobExecutions",
    "max":50,
    "remaining":50  
},
{
    "name":"DailyApiRequests",
    "max":6175000,
    "remaining":6174972 
},
{
    "name":"DailyAsyncApexExecutions",
    "max":325000,
    "remaining":324902  
}
]

En ceci:

{
    "ConcurrentAsyncGetReportInstances": {
        "Max": 200,
        "Remaining": 200
    },
    "ConcurrentSyncReportRuns": {
        "Max": 20,
        "Remaining": 20
    },
    "DailyAnalyticsDataflowJobExecutions": {
        "Max": 50,
        "Remaining": 50
    },
    "DailyApiRequests": {
        "Max": 6175000,
        "Remaining": 6174972,
        "Ant Migration Tool": {
            "Max": 0,
            "Remaining": 0
        },
        "CLM_service_api": {
            "Max": 0,
            "Remaining": 0
        },
        "CRM_service_api": {
            "Max": 0,
            "Remaining": 0
        }
    },
    "DailyAsyncApexExecutions": {
        "Max": 325000,
        "Remaining": 324902
 }

Aussi - notez que je ne veux pas toutes les valeurs imbriquées comme dans DailyApiRequests

J'ai essayé la fonction de carte mais je ne sais pas comment l'utiliser correctement. Tous les exemples que j'ai vus ne semblent pas montrer ce scénario.


0 commentaires

3 Réponses :


0
votes

Si vous êtes en JavaScript , vous pouvez utiliser le package lodash et utiliser sa fonction map :

Code

const _ = require('lodash')

const obj = ... // your object above
const res = _.map(obj, (v, k) => ({
  name: k, 
  max: v.Max, 
  remaining: v.Remaining
}))

console.log(res)

Sortie

 entrez la description de l'image ici

Consultez la documentation de lodash ici

L'autre chose que vous pouvez faire est de parcourir les propriétés de l'objet à la main et faites la carte par vous-même, mais je pense que vous finirez par réinventer la roue et faire exactement ce que fait lodash ;) alors, donnez-lui un essayer. Au fait, ce paquet est incroyable, il est extrêmement utile .


0 commentaires

0
votes

Similaire à Josué, mais sans introduire de dépendances inutiles.

var obj = {}; // your object above
var res = []; // New object
for(var key in obj) {
  if (!obj.hasOwnProperty(key)) continue;
  res.push({
    name: k, 
    max: obj[k].Max, 
    remaining: obj[k].Remaining
  });
}

Un autre exemple, mais avec une boucle simple:

const obj = {}; // your object above
const res = []; // New object
for(const [k, v] of Object.entries(obj)) {
  res.push({
    ...v,
    name: k
  });
}

Un exemple qui fonctionnera dans un navigateur vieux de 10 ans:

const obj = {} // your object above
const res = Object.entries(obj).map( [k, v] => ({
  name: k, 
  ...v
}))


0 commentaires

2
votes

Utilisation de DataWeave

%dw 1.0
%input payload application/json
%output application/json
---
payload pluck ((value,key) -> {
    name: key,
    max: value.Max,
    remaining: value.Remaining
  } 
)


1 commentaires

Merci! Marche parfaitement.