【问题标题】:How to load JSON file with date to Google Charts如何将带有日期的 JSON 文件加载到 Google 图表
【发布时间】:2020-02-26 14:36:56
【问题描述】:

由于未正确拟合 json 格式数据,我无法使用 google 图表绘制数据。我无法弄清楚如何操纵数据以获得预期的格式。数据来自 csv 文件。

我从 php 申请了file_get_contents(),然后返回:

[{"Fecha3":1566259200000,"Precio":30.0},
 {"Fecha3":1566345600000,"Precio":6.0},
 {"Fecha3":1566432000000,"Precio":4.0},
 {"Fecha3":1566518400000,"Precio":44.0},
 {"Fecha3":1566777600000,"Precio":80.0},
 {"Fecha3":1566864000000,"Precio":2.0}
] 

(简称解释)

所以我将 Unix 日期转换为 Google Charts 需要的格式。

当我应用下面的 php 代码时,getjson.php 文件的输出是:

{"new Date(2019, 08, 20)":30,
 "new Date(2019, 08, 21)":6,
 "new Date(2019, 08, 22)":4,
 "new Date(2019, 08, 23)":44,
 "new Date(2019, 08, 26)":80,
 "new Date(2019, 08, 27)":2
} 

(简称解释)

getjson.php

<?php
$fecha = new DateTime();
$strJsonFileContents = file_get_contents("datos_nego2.json");
$arr = json_decode($strJsonFileContents, true);
$result = [];
$i = 0;

// Loop to convert the unix date and sort the data
foreach($arr as $item) { 
    $uses1 = $item['Fecha3']/1000; 
    $uses2 = $item['Precio'];
    $fecha->setTimestamp($uses1);
    $datevar = "new Date(" .$fecha->format('Y, m, d') . ")"; 
    // I think months have to be months - 1
    $result[$datevar] = $uses2;
    $i++;
}

$jsonTable = json_encode($result);
echo $jsonTable;
?>

然后,我加载的文件是里面的javascript代码:

var jsonData = $.ajax({
     url: "getjson.php",
     dataType: "json",
     async: false
}).responseText;

var data = new google.visualization.DataTable(jsonData);

data.addColumn('date', 'Fecha');
data.addColumn('number', 'Number');

var options = {
    [...]
    hAxis: {   // I put fixed dates for testing
      viewWindow: {
        min: new Date(2019, 0, 1),
        max: new Date(2019, 11, 31)
    },
    [...]

显示图表,但未显示数据。 Javascript console.log(jsonData) 显示:
我读过here 的格式应该是:

{
  "cols": [
        {"id":"","label":"Topping","pattern":"","type":"string"},
        {"id":"","label":"Slices","pattern":"","type":"number"}
      ],
  "rows": [
        {"c":[{"v":"Mushrooms","f":null},{"v":3,"f":null}]},
        {"c":[{"v":"Onions","f":null},{"v":1,"f":null}]},
        {"c":[{"v":"Olives","f":null},{"v":1,"f":null}]},
        {"c":[{"v":"Zucchini","f":null},{"v":1,"f":null}]},
        {"c":[{"v":"Pepperoni","f":null},{"v":2,"f":null}]}
      ]
}

但我不知道如何转换!

我尝试过但失败的可能解决方案:

  • 如上所述将csv原始文件转换为json样式。

  • var jsonData下面添加javascript代码来操作它。

我在其他示例中看到了不同的解决方案:

data.addRows([
[new Date(2019, 1, 1), 0.2],    [new Date(2019, 2, 1), 0.8],
[new Date(2019, 3, 1), 0.4],    [new Date(2019, 4, 1), 0.4],
]);

我也尝试过,但从未实现绘制数据。

如果有任何建议或 sn-p 代码,我将不胜感激。

非常感谢您的时间和考虑! :-)

【问题讨论】:

  • 问题(我认为)是您的日期创建被视为字符串("new Date(2019, 08, 20)" 周围的引号)。不知道如何解决这个问题。
  • 你有没有发现"new Date(2019, index3.php:31 08, 21)":6, 看起来有点像一条错误消息!!!!你检查过 PHP 错误日志
  • @RiggsFolly index3.php:31 是显示在右上角的上下文信息。与console.log无关,谢谢!

标签: javascript php json csv google-visualization


【解决方案1】:

我刚刚找到了解决办法!!!

数据必须以如下形式呈现:

[{"Fecha":"2019, 08, 20","Precio":30},{"Fecha":"2019, 08, 21","Precio":6},{"Fecha":" 2019, 08, 22","Precio":4},{"Fecha":"2019, 08, 23","Precio":44},{"Fecha":"2019, 08, 26","Precio" :80},{"Fecha":"2019, 08, 27","Precio":2},{"Fecha":"2019, 09, 09","Precio":48},{"Fecha":" 2019, 09, 10","Precio":2}]

getjson.php文件完成:

<?php
$fecha = new DateTime();
$strJsonFileContents = file_get_contents("datos_nego2.json");
$arr = json_decode($strJsonFileContents, true);
$result = [];
$i = 0;

foreach($arr as $item) { //foreach element in $arr
    $uses1 = $item['Fecha3']/1000; //etc
    $uses2 = $item['Precio'];
    $fecha->setTimestamp($uses1);
    $datevar = $fecha->format('Y, m, d');
    $result[$i]['Fecha'] = $datevar;
    $result[$i]['Precio'] = $uses2;
    $i++;
}

$jsonTable = json_encode($result);
echo $jsonTable;
//echo $strJsonFileContents;

?>

然后,在javascript代码中:

    google.charts.load('current', {'packages':['corechart']});
    google.charts.setOnLoadCallback(drawChart);

    function drawChart() {

      var jsonData = $.ajax({
          url: "getjson2.php",
          dataType: "json",
          async: false
          }).responseText;
      var array_datos = JSON.parse(jsonData)
      var longitud_array = array_datos.length;

      var data = new google.visualization.DataTable();
      data.addColumn('date', 'Date');
      data.addColumn('number', 'Charge');

      for (var i = 0; i < longitud_array; i++) {
          console.log(array_datos[i]);
          data.addRow([
          new Date(array_datos[i].Fecha),
          parseFloat(array_datos[i].Precio),
        ]);
      }

【讨论】:

    【解决方案2】:

    您找到的解决方案可以使用,但需要在客户端进行额外处理。

    要将真实日期传递给 google,必须使用您找到的 json 格式。
    它基本上是相同的日期字符串,没有 new 关键字。
    你可以在这里找到参考 --> dates and times using the date string representation

    {
      "cols": [
            {"label":"Date","type":"date"},
            {"label":"Charge","type":"number"}
          ],
      "rows": [
            {"c":[{"v":"Date(2019, 7, 20)"},{"v":20}]},
            {"c":[{"v":"Date(2019, 7, 21)"},{"v":21}]},
            {"c":[{"v":"Date(2019, 7, 22)"},{"v":22}]},
          ]
    }
    

    是的,月份需要减一...

    这是您可以使用的 php 示例(未测试)

    <?php
    $fecha = new DateTime();
    $strJsonFileContents = file_get_contents("datos_nego2.json");
    $arr = json_decode($strJsonFileContents, true);
    
    // create data table, with columns
    $table = [];
    $table['cols'] = [
        ['label' => 'Date', 'type' => 'date'],
        ['label' => 'Charge', 'type' => 'number']
    ];
    
    // Loop to convert the unix date and sort the data
    $rows = [];
    foreach($arr as $item) {
        $uses1 = $item['Fecha3']/1000;
        $uses2 = $item['Precio'];
        $fecha->setTimestamp($uses1);
    
        // month does have to be - 1
        $datevar = "Date(".$fecha->format('Y').", ".((int) $fecha->format('m') - 1).", ".$fecha->format('d').")";
    
        // create rows
        $result = [];
        $result[] = ['v' => (string) $datevar];
        $result[] = ['v' => (float) $uses2];
        $rows[] = ['c' => $result];
    }
    
    $table['rows'] = $rows;
    $jsonTable = json_encode($table);
    echo $jsonTable;
    ?>
    

    那么在客户端,你只需要将json传递给数据表构造函数即可。

    var data = new google.visualization.DataTable(jsonData);
    

    您不需要添加列或行...

    google.charts.load('current', {
      packages: ['corechart']
    }).then(function () {
    
      $.ajax({
        url: 'getjson2.php',
        dataType: 'json'
      }).done(function (jsonData) {
    
        var data = new google.visualization.DataTable(jsonData);
    
        var options = {
          hAxis: {
            viewWindow: {
              min: new Date(2019, 0, 1),
              max: new Date(2019, 11, 31)
            }
          }
        };
    
        var chart = new google.visualization.LineChart(document.getElementById('chart'));
    
        chart.draw(data, options);
    
      });
    });
    

    注意:ajax 上的async: false 已被弃用,不应再使用。
    改用done 回调(参见上面的sn-p)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      相关资源
      最近更新 更多