0
votes

Extracteur Jmeter JSON avec un nœud vide

J'ai une réponse JSON comme celle-ci

`{
   "data": [
      {
         "id": "1",
          "type": "status",
         "created_time": "2010-08-02T22:27:44+0000",
         "updated_time": "2010-08-02T22:27:44+0000"
      },
      {
         "id": "2",
         "message": "JSON is much easier and better than XML",
         "created_time": "2010-08-02T25:27:44+0000",
         "updated_time": "2010-08-02T25:27:44+0000"
      },
      {
         "id": "3",
         "created_time": "2010-08-02T25:27:44+0000",
         "updated_time": "2010-08-02T25:27:44+0000"
      },
      {
         "id": "4",
         "message": "JSON is much easier and better than XML",
         "created_time": "2010-08-02T25:27:44+0000",
         "updated_time": "2010-08-02T25:27:44+0000"
      },
      {
         "id": "5",
         "created_time": "2010-08-02T25:27:44+0000",
         "updated_time": "2010-08-02T25:27:44+0000"
      },
      {
         "id": "6",
         "message": "JSON is much easier and better than XML",
         "created_time": "2010-08-02T25:27:44+0000",
         "updated_time": "2010-08-02T25:27:44+0000"
      }
   ]
}`

Maintenant, comme vous pouvez le voir, il manque le champ de message aux nœuds 1, 3 et 5 J'extrait les valeurs pour id, message, created_time et updated_time à l'aide de l'extracteur json avec match no -1 les valeurs sont extraites correctement, je les écris dans le fichier CSV à l'intérieur de la boucle for en utilisant le ID_matchNr pour le nombre maximum Mais le problème auquel je suis confronté est que puisque nous n'avons aucune valeur dans le nœud 1, mais quand je l'écris, écrivez le message valeur du nœud 2.

Comment puis-je écrire null pour le message des nœuds 1, 3 et 5?

Une des options que je pensais était d'ajouter un échantillonneur factice et d'utiliser la même charge utile et extrayez la valeur du message à l'aide de l'extracteur conditionnel json basé sur l'ID extrait de la première réponse de l'échantillonneur.

Une des autres options que j'ai pensé était d'utiliser le foreachcontroller et d'utiliser l'échantillonneur pour écrire dans le fichier c'était I peut être en mesure d'utiliser la valeur de message correspondante de id, mais cela aura à nouveau un autre échantillonneur beanshell à écrire dans le fichier.

Mais j'espérais avoir une solution plus simple plutôt que de faire une autre requête d'échantillonnage

Voici à quoi je veux que les données du fichier CSV ressemblent à:

entrez la description de l'image ici


2 commentaires

Pouvez-vous également montrer le format de sortie dont vous avez besoin? Quels paramètres écrivez-vous exactement?


Voici comment je veux avoir: 'id type Message created_time updated_time 1 status Null 2010-08-02T22: 27: 44 + 0000 2010-08-02T22: 27: 44 + 0‌ 000 2 status JSON est beaucoup plus facile et meilleur que XML 2010-08-02T22: 27: 44 + 0001 2010-08-02T22: 27: 44 + 0001 3 statut Null 2010-08-02T22: 27: 44 + 0002 2010-08-02T22: 27: 44 + 0‌ 002 4 status JSON est beaucoup plus facile et meilleur que XML 2010-08-02T22: 27: 44 + 0003 2010-08-02T22: 27: 44 + 0003 5 status Null 2010-08-02T22: 27: 44 + 0004 2010-08- 02T22: 27: 44 + 0‌ 004 6 statut Null 2010-08-02T22: 27: 44 + 0004 2010-08-02T22: 27: 44 + 0‌ 004 '


3 Réponses :


1
votes

Pour y parvenir, vous devez analyser cette réponse JSON avec la classe JSON en Java.

  1. Récupérez la bibliothèque JSON à partir du référentiel Maven et placez-la dans JMeter Chemin de classe

     entrez la description de l'image ici

  2. Assurez-vous de redémarrer JMeter

  3. Extraire la réponse JSON complète à l'aide de JSON Extractor

  4. Mettez le code JAVA suivant dans l'échantillonneur JSR223 et sélectionnez la langue java

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    String response = vars.get("jsonOutput");
    
    JSONObject myObject = new JSONObject(response);
    JSONArray data = myObject.optJSONArray("data");
    
    log.info("ID\tType\t\tMessage\tCreated Time\tUpdated Time");
    for (int i = 0, size = data.length(); i < size; i++) {
        JSONObject objectInArray = data.getJSONObject(i);
        String id = objectInArray.optString("id");
        String type = objectInArray.optString("type");
        String created_time = objectInArray.optString("created_time");
        String updated_time = objectInArray.optString("updated_time");
        String message = objectInArray.optString("message");
    
        if(id.isEmpty()) {
            id = null;
        }
        if(type.isEmpty()) {
            type = null;
        }
        if(created_time.isEmpty()) {
            created_time = null;
        }
        if(updated_time.isEmpty()) {
            updated_time = null;
        }
        if(message.isEmpty()) {
            message = null;
        }
        log.info(id + "\t" + type + "\t" + message + "\t" + created_time + "\t" + updated_time);
    }
    

 entrez la description de l'image ici entrez la description de l'image ici


0 commentaires

0
votes

Merci beaucoup @SAIR c'était génial, je ne suis pas un codeur mais j'ai réussi à contourner mon chemin. Cela a résolu une grande partie de mon problème actuel et futur, je n'ai plus besoin d'appeler des échantillonneurs factices dans le contrôleur foreach.

J'ai ajouté une autre ligne pour extraire le champ imbriqué, voici le code modifié que j'utilise

JSONObject NameobjectInArray = objectInArray.getJSONObject("Name");  -- **I used this to get the nested fields**

String FirstName = NameobjectInArray.optString ("FirstName");


0 commentaires

0
votes

Vous pouvez envisager d'utiliser JSR223 PostProcessor et JsonSlurper combinaison pour effectuer cela en un seul coup

  1. Ajouter JSR223 PostProcessor en tant qu'enfant de la requête qui renvoie au-dessus de JSON
  2. Mettez le code suivant dans la zone "Script":

    1,null,2010-08-02T22:27:44+0000,2010-08-02T22:27:44+0000
    2,JSON is much easier and better than XML,2010-08-02T25:27:44+0000,2010-08-02T25:27:44+0000
    3,null,2010-08-02T25:27:44+0000,2010-08-02T25:27:44+0000
    4,JSON is much easier and better than XML,2010-08-02T25:27:44+0000,2010-08-02T25:27:44+0000
    5,null,2010-08-02T25:27:44+0000,2010-08-02T25:27:44+0000
    6,JSON is much easier and better than XML,2010-08-02T25:27:44+0000,2010-08-02T25:27:44+0000
    
  3. Voilà, une fois que vous exécutez votre test, myfile.csv sera généré dans le dossier "bin" de votre installation JMeter ressemblant à:

    new groovy.json.JsonSlurper().parse(prev.getResponseData()).data.each { entry ->
        new File('myfile.csv') << entry.id << ',' << entry.message << ',' << entry.created_time << ',' << entry.updated_time << System.getProperty('line.separator')
    }
    

Plus d'informations: Apache Groovy - Pourquoi et comment utiliser Il


2 commentaires

Je n'obtiens PAS d'erreur mais aucun fichier n'est généré. J'ai pu utiliser pour faire fonctionner cela avec ma solution ci-dessous, mais je veux savoir comment cela fonctionne, alors j'ai essayé ceci: def jsonSlurper = new JsonSlurper (); def response = jsonSlurper.parseText (prev.getResponseDataAsString ()); def data = JsonOutput.toJson (response.data); monfichier = props.get ("NomFichier"); new groovy.json.JsonSlurper (). parse (prev.getResponseData ()). data‌ .each {entry -> new File ('myfile') << entry.data [0] .a << ',' << entry.data [0] .b << ',' << entry.data [0] .c << ',' << entry.data [0] .d << System.getProperty ('line.separator') }


Mais cela ne fonctionnait pas non plus, aucun fichier généré dans le dossier bin