首页 > 解决方案 > 如何从json中提取多层数组

问题描述

我有一个类似于以下架构的 JSON 响应...

{
    "resultCode": 200,
    "message": "Success",
    "generated": "2018-11-14T18:42:02",
    "expires": "2018-11-14T18:50:00",
    "data": {
        "generationByFuel": [
            {
                "date": "2018-11-14T00:00:00",
                "period": 37,
                "generation": [
                    {
                        "fuel": "Hydro",
                        "generation": 1011.298,
                        "capacity": 2000
                    },
                    {
                        "fuel": "Wind",
                        "generation": 2544.788,
                        "capacity": 3500
                    }
                ]
            },
            {
                "date": "2018-11-14T00:00:00",
                "period": 36,
                "generation": [
                    {
                        "fuel": "Hydro",
                        "generation": 1100,
                        "capacity": 2000
                    },
                    {
                        "fuel": "Wind",
                        "generation": 2500,
                        "capacity": 3500
                    }
                ]
            }
        ]
    }
}

由此,我需要提取多个数组,这些数组将插入到 googlesheet(“shtGen”)中,填充以下列:

| 日期 | 期间 | 燃料 | 一代 | 容量 | 运行时 |

我猜我需要做的是写一些输出的东西,(generationByFuel[i](generation[r]))但我正在努力弄清楚如何做到这一点。

我尝试了多种选择,但以下是我认为我走在正确轨道上的最后一次努力。也就是说,该函数运行时不会返回错误,但不会将任何信息插入到谷歌表中。当我使用调试器运行该函数时,也会发生同样的事情。

// define output to paste into sheet
for (var i in genData) {
  var iInput = [];
  iInput.push(genData[i].date);
  iInput.push(genData[i].period);
  for (var r in fuelData) {
    var rInput = [];
    rInput.push(fuelData[r].fuel);
    rInput.push(fuelData[r].capacity);
    rInput.push(fuelData[r].generation);
    rInput.push(now = new Date());
    shtGen.appendRow(iInput + rInput);
  }
}

任何帮助或建议将不胜感激。提前致谢!

标签: arraysjsongoogle-apps-script

解决方案


这个改装怎么样?我认为您的情况有几种解决方案。因此,请将此视为其中之一。

修改点:

  • fuelData需要在第一个 for 循环中声明。
    • @Slai 提到了这一点。
  • iInput + rInput变成字符串类型。这样,在 处发生错误appendRow()
    • iInput.concat(rInput)用于此。
  • 为了安排到| Date | Period | Fuel | Generation | Capacity | Runtime |,推送值的顺序需要是
    1. rInput.push(fuelData[r].fuel)
    2. rInput.push(fuelData[r].generation)
    3. rInput.push(fuelData[r].capacity)

在这个修改后的脚本中,obj您的问题中是否有您的 json 对象。然后shtGen假设工作表对象。

修改后的脚本:

var obj = {### your json object ###};
var genData = obj.data.generationByFuel;
for (var i in genData) {
  var iInput = [];
  iInput.push(genData[i].date);
  iInput.push(genData[i].period);
  var fuelData = genData[i].generation; // Added
  for (var r in fuelData) {
    var rInput = [];
    rInput.push(fuelData[r].fuel); // Modified
    rInput.push(fuelData[r].generation); // Modified
    rInput.push(fuelData[r].capacity); // Modified
    rInput.push(new Date());
    shtGen.appendRow(iInput.concat(rInput)); // Modified
  }
}

我认为当对象很大时,appendRow()成为工艺成本增加的原因。所以我建议setValues()用于将值放入电子表格,如下所示。

var obj = {### your json object ###};
var res = [];
var genData = obj.data.generationByFuel;
for (var i in genData) {
  var iInput = [];
  iInput.push(genData[i].date);
  iInput.push(genData[i].period);
  var fuelData = genData[i].generation;
  for (var r in fuelData) {
    var rInput = [];
    rInput.push(fuelData[r].fuel);
    rInput.push(fuelData[r].generation);
    rInput.push(fuelData[r].capacity);
    rInput.push(new Date());
    res.push(iInput.concat(rInput)); // Modified
  }
}
shtGen.getRange(shtGen.getLastRow() + 1, 1, res.length, res[0].length).setValues(res); // Added

其他图案:

作为其他修改之一,您还可以使用以下脚本。此脚本的成本低于上述脚本。

var obj = {### your json object ###};
var res = obj.data.generationByFuel.reduce(function(ar, e) {
  return ar.concat(e.generation.map(function(f) {
    return [e.date, e.period, f.fuel, f.generation, f.capacity, new Date()];
  }));
}, []);
shtGen.getRange(shtGen.getLastRow() + 1, 1, res.length, res[0].length).setValues(res);

参考:

如果这不是你想要的,请告诉我。我想修改它。


推荐阅读