Search code examples
javascriptjsonjsonpathzabbix

extract json with javascript preprocessing Zabbix


i'm trying to extrapolate a json if a string is contained. My json is this:

[
   {
      "name":"PE02S-PK00400_2002",
      "ip":"",
      "pk":0.4,
      "roadCode":"A32",
      "roadName":"A32",
      "roadDescription":"A32 TORINO-BARDONECCHIA",
      "directionName":"A32_DIR_A",
      "directionDescription":"BARDONECCHIA",
      "sectionName":"A32_DIR_A_SEZ1",
      "sectionDescription":"RIVOLI - SUSA",
      "laneName":null,
      "laneDescription":null,
      "tunnelName":"A32_GALLERY_LA_PEROSA",
      "tunnelDescription":"LA PEROSA",
      "idTecnico":"2002"
   },
   {
      "name":"PE04S-PK00500_2004",
      "ip":"",
      "pk":0.5,
      "roadCode":"A32",
      "roadName":"A32",
      "roadDescription":"A32 TORINO-BARDONECCHIA",
      "directionName":"A32_DIR_A",
      "directionDescription":"BARDONECCHIA",
      "sectionName":"A32_DIR_A_SEZ1",
      "sectionDescription":"RIVOLI - SUSA",
      "laneName":null,
      "laneDescription":null,
      "tunnelName":"A32_GALLERY_LA_PEROSA",
      "tunnelDescription":"LA PEROSA",
      "idTecnico":"2004"
   },
   {
      "name":"PE06S-PK00750_2006",
      "ip":"",
      "pk":0.75,
      "roadCode":"A32",
      "roadName":"A32",
      "roadDescription":"A32 TORINO-BARDONECCHIA",
      "directionName":"A32_DIR_A",
      "directionDescription":"BARDONECCHIA",
      "sectionName":"A32_DIR_A_SEZ1",
      "sectionDescription":"RIVOLI - SUSA",
      "laneName":null,
      "laneDescription":null,
      "tunnelName":"A32_GALLERY_LA_PEROSA",
      "tunnelDescription":"LA PEROSA",
      "idTecnico":"2006"
   }
]

The javascript script is this:

function (value) {
    var res = ''
    var json = JSON.parse(value)

    for (i = 0; i < json.length; i++) {

        if (json[i].name =~ "{HOST.NAME}") {

            res = JSON.stringify(json[i])

            return res
        }

    }

}

{HOST.NAME} is SOS-PE02S-PK00400

Everything works, except the field (name) is -1.

Here is the result:

{
   "name":-1,
   "ip":"",
   "pk":0.4,
   "roadCode":"A32",
   "roadName":"A32",
   "roadDescription":"A32 TORINO-BARDONECCHIA",
   "directionName":"A32_DIR_A",
   "directionDescription":"BARDONECCHIA",
   "sectionName":"A32_DIR_A_SEZ1",
   "sectionDescription":"RIVOLI - SUSA",
   "laneName":null,
   "laneDescription":null,
   "tunnelName":"A32_GALLERY_LA_PEROSA",
   "tunnelDescription":"LA PEROSA",
   "idTecnico":"2002"
}

Here is the result I would expect:

{
   "name":"PE02S-PK00400_2002",
   "ip":"",
   "pk":0.4,
   "roadCode":"A32",
   "roadName":"A32",
   "roadDescription":"A32 TORINO-BARDONECCHIA",
   "directionName":"A32_DIR_A",
   "directionDescription":"BARDONECCHIA",
   "sectionName":"A32_DIR_A_SEZ1",
   "sectionDescription":"RIVOLI - SUSA",
   "laneName":null,
   "laneDescription":null,
   "tunnelName":"A32_GALLERY_LA_PEROSA",
   "tunnelDescription":"LA PEROSA",
   "idTecnico":"2002"
}

I don't understand where is wrong. If you can help me I am grateful. Thank you very much.


Solution

  • = is used for assignment but not for comparison.

    == or === for comparison.

    Since for loop starts perfectly but when it goes to if condition, first of all you're not checking for equality instead you are assigining to json[i].name which is the first element/object of json arrray to whatever ~"{HOST.NAME}" returns which would be -1(see the below snippet).

    Then you console.log that object i.e json[0] and you're assigning the result of JSON.stringify(json[i]) to res and return the result.

    console.log( ~"AnythingString" );

    To check if some text includes in a string then you can use includes

    const name = "marcombar";
    
    const result = name.includes("bar");
    console.log(result);

    If you need to check/compare it with json[i].name

    const json = [{
        name: "PE02S-PK00400_2002",
        ip: "",
        pk: 0.4,
        roadCode: "A32",
        roadName: "A32",
        roadDescription: "A32 TORINO-BARDONECCHIA",
        directionName: "A32_DIR_A",
        directionDescription: "BARDONECCHIA",
        sectionName: "A32_DIR_A_SEZ1",
        sectionDescription: "RIVOLI - SUSA",
        laneName: null,
        laneDescription: null,
        tunnelName: "A32_GALLERY_LA_PEROSA",
        tunnelDescription: "LA PEROSA",
        idTecnico: "2002",
      },
      {
        name: "PE04S-PK00500_2004",
        ip: "",
        pk: 0.5,
        roadCode: "A32",
        roadName: "A32",
        roadDescription: "A32 TORINO-BARDONECCHIA",
        directionName: "A32_DIR_A",
        directionDescription: "BARDONECCHIA",
        sectionName: "A32_DIR_A_SEZ1",
        sectionDescription: "RIVOLI - SUSA",
        laneName: null,
        laneDescription: null,
        tunnelName: "A32_GALLERY_LA_PEROSA",
        tunnelDescription: "LA PEROSA",
        idTecnico: "2004",
      },
      {
        name: "PE06S-PK00750_2006",
        ip: "",
        pk: 0.75,
        roadCode: "A32",
        roadName: "A32",
        roadDescription: "A32 TORINO-BARDONECCHIA",
        directionName: "A32_DIR_A",
        directionDescription: "BARDONECCHIA",
        sectionName: "A32_DIR_A_SEZ1",
        sectionDescription: "RIVOLI - SUSA",
        laneName: null,
        laneDescription: null,
        tunnelName: "A32_GALLERY_LA_PEROSA",
        tunnelDescription: "LA PEROSA",
        idTecnico: "2006",
      },
    ];
    
    function convert() {
      for (i = 0; i < json.length; i++) {
        const nameToCheck = "SOS-PE02S-PK00400";
        if (json[i].name.includes(nameToCheck)) {
          console.log("Equal");
          console.log(json[i]);
          res = JSON.stringify(json[i]);
          return res;
        } else {
          console.log("Not Equal");
        }
      }
    }
    convert();