JS导入更新的JSON文件以与ChartJS一起使用

时间:2018-09-25 14:02:24

标签: javascript arrays json chart.js

我正在尝试导入和读取JSON文件,该文件每隔几分钟就会通过不同的过程进行更新。我需要遍历此JSON文件中的值,以用于ChartJS.org。

如果我将JSON数据保留在脚本的本地变量中(var jsonfile = {}),则图表将按预期工作。

我正在努力做的是从脚本外部导入JSON文件(该文件位于本地Web服务器上的其他文件夹下)。

JSON文件的外观与以下var中的数据完全相同。

以下内容按预期工作。

<div class="row">
                <div class="col-4">
                    <div class="ca-comms-by-month">
                    </div>
                    <script>
                    var jsonfile = {
                         "comms_by_month": [
                             {
                                "name": "July",
                                "count": 2130
                             },
                             {
                                "name": "August",
                                "count": 890
                             },
                             {
                                "name": "September",
                                "count": 1654
                             },
                             {
                                "name": "October",
                                "count": 120
                             }
                         ]
                    };
                        var labels = jsonfile.comms_by_month.map(function(e) {
                         return e.name;
                      });
                      var data = jsonfile.comms_by_month.map(function(e) {
                         return e.count;
                      });
                        function createConfig(details, data) {
                            return {
                                type: 'line',
                                data: {
                                    labels: labels,
                                    datasets: [{
                                        label: 'Comms count by month',
                                        steppedLine: details.steppedLine,
                                        data: data,
                                        borderColor: details.color,
                                        fill: true,
                                    }]
                                },
                                options: {
                                    responsive: true,
                                    title: {
                                        display: false,
                                        text: details.label,
                                    },
                                    tooltips: {
                                        enabled:true, // Disable this for custom tool tips || http://www.chartjs.org/docs/latest/configuration/tooltip.html
                                        mode: 'index',
                                        intersect: false,
                                        cornerRadius:0
                                    },
                                    hover: {
                                        mode: 'nearest',
                                        intersect: true
                                    },
                                    scales: {
                                xAxes: [{
                                  display: true,
                                  scaleLabel: {
                                    display: true,
                                    labelString: 'Month'
                                  }
                                }],
                                yAxes: [{
                                  display: true,
                                  scaleLabel: {
                                    display: true,
                                    labelString: 'Count'
                                  },
                                  ticks: {
                                      beginAtZero:true
                                    }
                                }]
                              },
                              legend: {
                                display: false, // False to hide the legdend dataset tile
                                labels: {
                                  fontColor: 'rgb(255, 99, 132)'
                                }
                              }
                                }
                            };
                        }
                        window.onload = function()
                        {
                            var container = document.querySelector('.ca-comms-by-month');
                            var steppedLineSettings = [{
                                steppedLine:false,
                                label: '',
                                color: window.chartColors.purple
                            }];
                            steppedLineSettings.forEach(function(details) {
                                var div = document.createElement('div');
                                div.classList.add('chart-container');
                                var canvas = document.createElement('canvas');
                                div.appendChild(canvas);
                                container.appendChild(div);
                                var ctx = canvas.getContext('2d');
                                var config = createConfig(details, data);
                                new Chart(ctx, config);
                            });
                        };
                    </script>
                </div>
            </div>

下面的代码将基于getElementById名称显示更新的JSON文件中的一些数据,但这对我不利,因为我需要ChartJS来获取值。

                        <h1 class="toolsportal text-right">Temp</h1>
                    <p id="demo"></p>
                    <p id="demo1"></p>
                    <br /><br /><br /><br />
                <script>
                  var jsonurl = 'http://mydevicename/portal/js/export_json/dash-comms-month.json';
                  var xmlhttp = new XMLHttpRequest();
                  xmlhttp.onreadystatechange = function()
                        {
                      if (this.readyState == 4 && this.status == 200)
                      {
                          var jsonfile = JSON.parse(this.responseText);
                          document.getElementById("demo").innerHTML = jsonfile.comms_by_month[0].month;
                                        document.getElementById("demo1").innerHTML = jsonfile.comms_by_month[0].name;
                      }
                  };
                  xmlhttp.open("GET", jsonurl, true);
                  xmlhttp.send();
                </script>

我无法汇总的是如何使用下面的函数从更新的JSON文件中获取值,这些函数很高兴从本地jsonfile {}变量中获取数据。

                                    var labels = jsonfile.comms_by_month.map(function(e){return e.name;});
var data = jsonfile.comms_by_month.map(function(e){return e.count;});

我显然缺少一些基本知识,任何指针都很好。

谢谢

1 个答案:

答案 0 :(得分:0)

我已经通过正确查看XMLHttpRequest()和JSON.parse()来回答自己的问题。

如果有人希望将JSON文件挂接到https://www.chartjs.org/图表中,则以下内容可能会有所帮助。

JSON文件

"comms_by_month":[
  {
   "name": "July",
   "month":7,
   "count":0
  },
  {
   "name": "August",
   "month":8,
   "count":1652
  },
  {
   "name": "September",
   "month":9,
   "count":600
  },
  {
   "name": "October",
   "month":10,
   "count":0
 },
  {
   "name": "November",
   "month":11,
   "count":0
 },
  {
   "name": "December",
   "month":12,
   "count":0
  }
]

将JSON文件放入变量中

<script>
  // Set the var for the json file located on the web server 
  var jsonFile_dash_comms_by_month = 'http://hostname/portal/js/export_json/dash-comms-by-month.json';
  var request = new XMLHttpRequest();
  request.open("GET",jsonFile_dash_comms_by_month,false);
  request.send(null)
  var jsonObj_dash_comms_by_month = JSON.parse(request.responseText);
</script>

将在其中显示图表的div

<div class="ca-comms-by-month"></div>

用于将标签和数据集放入变量的功能

<script>
    var labels = jsonObj_dash_comms_by_month.comms_by_month.map(function(e) {
      return e.name;
    });
    var data = jsonObj_dash_comms_by_month.comms_by_month.map(function(e) {
      return e.count;
    });
</script>

用于创建CharJS配置的功能

有关ChartJs配置的更多信息,请参见(http://www.chartjs.org/docs/latest/configuration/)。

<script>
  function createConfig(details, data) {
    return {
        type: 'line',
        data: {
            labels: labels,
            datasets: [{
                label: 'Comms count by month',
                steppedLine: details.steppedLine,
                data: data,
                borderColor: details.color,
                fill: true,
            }]
        },
        options: {
            responsive: true,
            title: {
                display: false,
                text: details.label,
            },
            tooltips: {
                enabled:true, // Disable this for custom tool tips || http://www.chartjs.org/docs/latest/configuration/tooltip.html
                mode: 'index',
                intersect: false,
                cornerRadius:0
            },
            hover: {
                mode: 'nearest',
                intersect: true
            },
            scales: {
        xAxes: [{
          display: true,
          scaleLabel: {
            display: true,
            labelString: 'Month'
          }
        }],
        yAxes: [{
          display: true,
          scaleLabel: {
            display: true,
            labelString: 'Count'
          },
          ticks: {
              beginAtZero:true
            }
        }]
      },
      legend: {
        display: false, // False to hide the legdend dataset tile
        labels: {
          fontColor: 'rgb(255, 99, 132)'
        }
      }
        }
    };
}<script>

加载时显示图表的功能

<script>
    window.onload = function()
    {
        var container = document.querySelector('.ca-comms-by-month');
        var steppedLineSettings = [{
            steppedLine:false,
            label: '',
            color: window.chartColors.purple
        }];
        steppedLineSettings.forEach(function(details) {
            var div = document.createElement('div');
            div.classList.add('chart-container');
            var canvas = document.createElement('canvas');
            div.appendChild(canvas);
            container.appendChild(div);
            var ctx = canvas.getContext('2d');
            var config = createConfig(details, data);
            new Chart(ctx, config);
        });
    };
</script>

这给了我下面的图表

enter image description here

我很想听到任何人可以指出上述方面的任何改进。我预计仪表板类型页面上将有10多个图表。

谢谢

埃德沃利