【问题标题】:Issues with JSON formatting for data object in GrafanaGrafana 中数据对象的 JSON 格式问题
【发布时间】:2019-07-01 01:11:20
【问题描述】:

数据没有以正确的 JSON 格式输入,所以我必须遍历数组中的项目来修复格式,解析更改的项目,当一切都完成后我不能使用新对象,因为它不再在数组中。数据如下: 数据[数据点:[0..1..] 目标:“up{cluster="bluehills_c3260_cluster",component="atr",datacenter="bluehills",hostname="ny-153-177"...}"] 有没有更简单的方法可以使用 .map 函数或其他方法进行转换,以使事情更清洁并获得所需的结果?

我尝试了几种方法,包括 .replace、.map 和 .push。我也尝试过 JSON.stringify,但除了我目前拥有的之外,似乎没有其他方法可以工作。

onDataReceived(data) {
  var i;
  for (i = 0; i < data.length; i++) {  // Loop through data array
    var txt = data[i].target;  // Create the variable to store the data target
    var j;
    for (j = 0; j <= txt.length; j++) {  // Loop through the data target
      var newObj = txt.slice(2,j);  // Remove "up"
      var filteredObj = newObj  // Change over to JSON format...
      .replace(/=/g,' : ')
      .replace(/,/g,', ')
      .replace(/{/g,'{ ')
      .replace(/cluster/g,'"cluster"')
      .replace(/component/g,'"component"')
      .replace(/datacenter/g,'"datacenter"')
    }
    var dataObj = filteredObj.replace(/_"cluster"/gi,'_cluster');
    var finalObj = JSON.parse(dataObj);
    console.log("finalObj", dataObj);
  }
}

我想要的是一个具有正确 JSON 格式的单个数组,用于传入的数据(目标)。

【问题讨论】:

  • 什么是datadata [datapoints: [0..1..] target: "up{cluster="bluehills_c3260_cluster",component="atr",datacenter="bluehills",hostname="ny-153-177"...}"]
  • 根据我开发Grafana插件的经验,data可能是一个列表。它应该由一个数据点数组组成,其中数组中的每个项目只是另一个长度为 2 的数组。Pos 0 是时间 Pos 1 是值。例如。 { datapoints: [ [10000, 20], [20000, 30] ], target: "Blah", somethingElse: {} }

标签: javascript arrays json grafana


【解决方案1】:

这个怎么样?

const myReg = /([\w\s]+)=\"([^"]*)\"/g
const str = `data [datapoints: [0..1..] target: "up{cluster="bluehills_c3260_cluster",component="atr",datacenter="bluehills",hostname="ny-153-177"...}"]`;
let matches = null;
const resultsJson = {};
while(matches = myReg.exec(str)){
    resultsJson[matches[1]] = matches[2];
}   

{ 集群:'bluehills_c3260_cluster', 组件:'atr', 数据中心:“蓝山”, 主机名:'ny-153-177' }

不确定这是否是您希望存储数据的方式,但该部分很容易自定义。

【讨论】:

  • 除了错误,我什么也没得到。我认为此特定设置不允许使用 regEx。
【解决方案2】:
onDataReceived(data){
    this.createCosmo(data);
  }

  createCosmo(data) {

    var arr = $.map(data,function(value){
      return value.target;
    });

    var arr2 = $.map(arr,function(value){
     var newObj = value.slice(2);  // Remove "up"
     var filteredObj = newObj  // Change over to JSON format
         .replace(/=/g,' : ')
         .replace(/,/g,', ')
         .replace(/{/g,'{ ')
         .replace(/cluster/g,'"cluster"')
         .replace(/component/g,'"component"')
         .replace(/datacenter/g,'"datacenter"')
         .replace(/hostname/g,'"hostname"')
         .replace(/instance/g,'"instance"')
         .replace(/job/g,'"job"')
         .replace(/resilience_group/g,'"resilience_group"')
         .replace(/_"cluster"/gi,'_cluster')
         .replace(/-"cluster"/gi,'-cluster');
         var finalObj = JSON.parse(filteredObj);  // Parse the Object into JSON
         return finalObj;
    });

}

【讨论】:

  • 这就是我最终要做的。我将处理数据的代码移到了一个新的生命周期钩子中。然后我在 onDataReceived 函数中调用该钩子并将数据传递给函数。接下来,我使用 $.map() 函数在不破坏数组的情况下遍历每条数据。然后我返回了一个对象,然后可以用来从中提取值。关键是美元。 (在这种情况下,有必要让正常功能正常工作)。我希望其他人可以从这个答案中受益。
猜你喜欢
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
相关资源
最近更新 更多