【问题标题】:Unable to retrieve contents of JSON post无法检索 JSON 帖子的内容
【发布时间】:2021-09-18 00:35:00
【问题描述】:

我在 Sheets 中有一个脚本,应该将 JSON 帖子展平,但在处理传入 JSON 的格式时遇到了一些困难。

下面,我有一个我试图解析的示例 POST。下面是我的 doPost 函数,其中包含我尝试获取内容的一些方法。 doPost 使用另一个函数来实际解析内容,但我似乎无法绕过看起来像数组格式的 JSON?

这是 POST 对象的示例:

[
  {
    "id": "xyz123",
    "payload": {
      "reference_id": "id_6",
      "unit_id": "000111222",
      "origin": {
        "name": "T-shirt Supply",
        "city": "Jiujiang",
        "state": "Jiangxi",
        "country": "China",
      },
      "destination": {
        "name": "Main Office",
        "city": "Surabaya",
        "state": "East Java",
        "country": "Indonesia",
      },
    },
    "status": "data_received",
    "created_at": "2020-01-29T07:41:33.918Z",
    "updated_at": "2020-01-29T07:41:33.918Z"
  }
]

我尝试了几种访问内容的方法,例如 payload.reference_id,但由于某种原因无法找到进入 JSON 对象的花括号的方法。以下是我尝试过的一些方法:

function doPost(e){
  var data = e.postData.contents;
  // returns JSON formatted [{ "id": "xyz", "payload" : {"reference" : "1", "updated" : true}}]

  var data2 = JSON.parse(e.postData.contents);
  // returns [object Object]
  
  var data3 = data[0];
  // returns [
  
  var data4 = ContentService.createTextOutput(e.postData.contents).setMimeType(ContentService.MimeType.JSON);
  // same result as 'data'
  
  return dataX;
}

我还尝试了各种解决方法,例如解析两次、字符串化等。非常感谢任何帮助!!!

【问题讨论】:

  • 可以查看请求内容类型吗?应该是postData.type。如果您要发送请求(而不是 webhook),请尝试将其设置为 application/json
  • 您好阿布拉,感谢您的回复。 postData.type 设置为 application/json
  • 您可以为 data2 尝试以下操作:Object.keys(data2)?这应该会显示对象上的所有键,并让您更好地理解结构。
  • 你能分享更多关于脚本的信息以及如何重现它吗?或者如果可能的话,分享项目的公共副本?

标签: javascript json google-apps-script google-sheets google-sheets-api


【解决方案1】:

我认为你不需要解析e.postData.contents,可能它已经是一个对象,而不是字符串。

或者如果是字符串并且只有一个元素,你可以试试这个:

var data2 = JSON.parse(e.postData.contents.slice(1,-1));

【讨论】:

    【解决方案2】:

    我相信你的目标如下。

    • 您想要输出数组中第一个元素的对象,它是来自doPost 的样本值。

    如果我的理解是正确的,那么下面的修改呢?

    修改脚本:

    function doPost(e){
      var data2 = JSON.parse(e.postData.contents);
      return ContentService.createTextOutput(JSON.stringify(data2[0])).setMimeType(ContentService.MimeType.JSON);
    }
    
    • 在此修改中,它假设e.postData.contents 是您的样本值。请注意这一点。
    • 使用上面修改的脚本时,返回数组的第一个元素。

    注意:

    参考:

    【讨论】:

      猜你喜欢
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2014-09-17
      • 2015-02-06
      • 1970-01-01
      相关资源
      最近更新 更多