PHP / Google Sheets API:未捕获 Google\Service\Exception 收到无效的 JSON 有效负载。 'data.values[0]

问题描述 投票:0回答:2

我正在使用 PHP 在 Google 表格中读取/写入数据,但收到错误 Uncaught Google\Service\Exception Invalid JSON Payload returned。 'data.values[0] 处有未知名称“0”。

我看过很多帖子都有同样的错误,但我不知道我的有效负载出了什么问题。我正在使用的脚本成功解析了 1000 多行,但突然在某一行中断,我不明白为什么。

这是 PHP 部分:

$updateRow = [$articles[$key]["id"],$articles[$key]["language"],$articles[$key]["rawurl"],$articles[$key]["publishdate"],$articles[$key]["modifieddate"],$articles[$key]["internal_title"],$articles[$key]["internal_desc"],$articles[$key]["seo_title"],$articles[$key]["seo_desc"],$articles[$key]["product"],$articles[$key]["score"],$articles[$key]["tags"],$articles[$key]["categories"],$articles[$key]["ads"]];
$rows = [$updateRow];
$valueRange = new \Google_Service_Sheets_ValueRange();
$valueRange->setValues($rows);
$range = 'Blog_Metadata!A'.$position; 
$options = ['valueInputOption' => 'USER_ENTERED'];
output($valueRange);
output($options);
$service->spreadsheets_values->update($spreadsheetId, $range, $valueRange, $options);

这对于所有其他条目都适用。现在让我们了解有效负载的详细信息。

$article[$key] 包含以下内容:

Array
(
[id] => 2187
[rawurl] => nl%2Froadtrip%2Frondreis-italie%2Fcomo-meer
[permalink] => nl/roadtrip/rondreis-italie/como-meer
[publishdate] => 1519675325
[modifieddate] => 1519675325
[language] => nl
[translations] => Array
    (
        [fr] => 2128
        [nl] => 2187
        [en] => 2177
        [es] => 
        [de] => 
        [it] => 
    )

[translations_url] => Array
    (
        [fr] => fr%2Fcircuits%2Fcircuit-italie%2Flac-de-come%2F
        [nl] => nl%2Froadtrip%2Frondreis-italie%2Fcomo-meer%2F
        [en] => en%2Froadtrips%2Froadtrip-italy%2Flake-como-visit%2F
        [es] => 
        [de] => 
        [it] => 
    )

[ads] => https://www.booking.com/searchresults.nl.html?ss=como&aid=324758
[internal_title] => Comomeer
[internal_desc] => Een echt concentraat van Italië met prachtige landschappen, bioscoopstukken, jetset, geschiedenis en goede (ijs)ballen.
[seo_title] => Comomeer - Reisverhaal (activiteiten, foto' s,...)
[seo_desc] => Een echt concentraat van Italië met prachtige landschappen, bioscoopstukken, jetset, geschiedenis en goede (ijs)ballen.
[product] => 
[score] => 
[tags] => 
[categories] => rondreis-italie
[thumbnail] => https://images.laurentwillen.be/sites/21/2018/02/lac-de-come-top-300x94.jpg
[thumbnail_large] => https://images.laurentwillen.be/sites/21/2018/02/lac-de-come-top-1400x438.jpg
[thumbnail_max] => https://images.laurentwillen.be/sites/21/2018/02/lac-de-come-top-1900x594.jpg
)

空字段很常见,这不是特有的。

$updateRow的内容是:

Array
(
[0] => 2187
[1] => nl
[2] => nl%2Froadtrip%2Frondreis-italie%2Fcomo-meer
[3] => 1519675325
[4] => 1519675325
[5] => Comomeer
[6] => Een echt concentraat van Italië met prachtige landschappen, bioscoopstukken, jetset, geschiedenis en goede (ijs)ballen.
[7] => Comomeer - Reisverhaal (activiteiten, foto' s,...)
[8] => Een echt concentraat van Italië met prachtige landschappen, bioscoopstukken, jetset, geschiedenis en goede (ijs)ballen.
[9] => 
[10] => 
[11] => 
[12] => rondreis-italie
[13] => https://www.booking.com/searchresults.nl.html?ss=como&aid=324758
)

内容为$valueRange为:

Google_Service_Sheets_ValueRange Object
(
[collection_key:protected] => values
[majorDimension] => 
[range] => 
[values] => Array
    (
        [0] => Array
            (
                [0] => 2187
                [1] => nl
                [2] => nl%2Froadtrip%2Frondreis-italie%2Fcomo-meer
                [3] => 1519675325
                [4] => 1519675325
                [5] => Comomeer
                [6] => Een echt concentraat van Italië met prachtige landschappen, bioscoopstukken, jetset, geschiedenis en goede (ijs)ballen.
                [7] => Comomeer - Reisverhaal (activiteiten, foto' s,...)
                [8] => Een echt concentraat van Italië met prachtige landschappen, bioscoopstukken, jetset, geschiedenis en goede (ijs)ballen.
                [9] => 
                [10] => 
                [11] => 
                [12] => rondreis-italie
                [13] => https://www.booking.com/searchresults.nl.html?ss=como&aid=324758
            )

    )

[internal_gapi_mappings:protected] => Array
    (
    )

[modelData:protected] => Array
    (
    )

[processed:protected] => Array
    (
    )

)

JSON 负载对我来说看起来不错。我将其与有效的有效负载进行了比较,但我发现没有任何区别。我有时会有空条目并且它有效。由于某种原因,此处的引号未正确呈现,但我在此条目之前有带引号的条目,并且一切正常。

您是否看到任何可以解释为什么我的脚本在该特定点中断的内容?

谢谢

php google-sheets-api
2个回答
1
投票

从您显示的样本值来看,我猜测空值可能是您当前问题

Invalid JSON payload received. Unknown name \"0\" at 'data.values[0]
的原因。如果我的理解正确的话,下面的修改如何?

来自:

$rows = [$updateRow];

致:

$rows = [array_map(function($e) {
  return (is_null($e)) ? "" : $e;
},$updateRow)];

或者,我认为这也可以使用。

$rows = [array_map('strval', $updateRow)];
  • 通过此修改,空值将转换为
    ""
  • $rows = [array_map('strval', $updateRow)];
    的情况下,我认为数值被作为
    USER_ENTERED
    的数字。

0
投票

就我而言,问题出在 php 关联数组和

json_encode
。只需尝试在传递给 Google API 的数组上执行
json_encode
并显示它,您就会看到一些意想不到的结果

而不是预期的结果

[
"a",
"b",
"c",
"d",
"e"
]

出乎我的意料

{
"0": "a",
"1": "b",
"2": "c",
"3": "d",
"11": "e"
}

原因在于我将值附加到数据数组的方式。我有一个包含 4 个元素的数组,当我为第 11 个元素赋值时,它将数组转换为关联数组

所以解决方案是创建没有间隙的新数组

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.