【问题标题】:extract json with javascript preprocessing Zabbix使用 javascript 预处理 Zabbix 提取 json
【发布时间】:2021-05-11 07:33:34
【问题描述】:

如果包含字符串,我正在尝试推断 json。我的 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"
   }
]

javascript 脚本是这样的:

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} 是 SOS-PE02S-PK00400

一切正常,除了字段(名称)为-1。

结果如下:

{
   "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"
}

这是我期望的结果:

{
   "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"
}

我不明白哪里错了。如果您能帮助我,我将不胜感激。 非常感谢。

【问题讨论】:

  • 你到底想达到什么目的?
  • @SAM 我想获取整个 JSON。
  • 已经是JS数组了。
  • @Reyno 我想知道我的字符串是否包含在 JSON 名称字段中并提取 json。用法 = ~
  • @SAM 问题是我得到了 json,但是 name 字段设置为 -1。为什么?

标签: javascript json jsonpath zabbix


【解决方案1】:

= 用于assignment,但不用于比较。

===== 对应 comparison

由于 for 循环完美启动,但是当它进入 if 条件时,首先您不是在检查相等性,而是在分配 json[i].name,这是 json 的第一个元素/对象~"{HOST.NAME}" 返回 -1(see the below snippet)

然后你console.log那个对象,即json[0],你将JSON.stringify(json[i])的结果分配给res并返回结果。

console.log( ~"AnythingString" );

要检查某些文本是否包含在字符串中,您可以使用includes

const name = "marcombar";

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

如果您需要检查/比较它与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();

【讨论】:

  • 更新了答案。接受答案如果我帮助了你并回答你想要的。
  • 我想知道该字符串是否包含在名称字段中,而不是是否完全相同。
  • 并非如此。我想知道该字符串是否包含在名称字段中,而不是是否完全相同。我正在尝试这个,但它不起作用。 var res = 0 var json = JSON.parse(value) for (i = 0; i &lt; json.length; i++) { const nameToCheck = "{HOST.NAME}"; var name = JSON.stringify(json[i].name); if (nameToCheck.includes(name, 0)) { res = JSON.stringify(json[i]); return res; } else { return res; } }
猜你喜欢
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 2012-04-29
相关资源
最近更新 更多