【问题标题】:JSON.parse() - SyntaxError: Expected end of stream at char 2JSON.parse() - SyntaxError: char 2 处的预期流结束
【发布时间】:2015-09-10 06:54:04
【问题描述】:

在我的project 中,我编写了 google 电子表格脚本来使用 sjcl 解密加密的单元格内容。但我失败了。

function encryptCell() {
  var masterKey = Browser.inputBox('Enter masterKey');
  var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  var cell = spreadSheet.getActiveSheet().getActiveCell();
  var input = cell.getValue();

  var encJson = sjcl.encrypt(masterKey, input);
/*
{"iv":"4psT+LTIh/aT7WWv7Ye7qw==","v":1,"iter":1000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"PjSOiia9TCM=","ct":"3hwmBbwQ7y/fsjk="}
*/
  var encStr = JSON.stringify(encJson);
/*
"{\"iv\":\"4psT+LTIh/aT7WWv7Ye7qw==\",\"v\":1,\"iter\":1000,\"ks\":128,\"ts\":64,\"mode\":\"ccm\",\"adata\":\"\",\"cipher\":\"aes\",\"salt\":\"PjSOiia9TCM=\",\"ct\":\"3hwmBbwQ7y/fsjk=\"}"
*/
  var encB64 = Utilities.base64Encode(encStr);
  Browser.msgBox(encB64);

  var rencStr = Utilities.base64Decode(encB64);
/*
34,123,92,34,105,118,92,34,58,92,34,52,112,115,84,43,76,84,73,104,47,97,84,55,87,87,118,55,89,101,55,113,119,61,61,92,34,44,92,34,118,92,34,58,49,44,92,34,105,116,101,114,92,34,58,49,48,48,48,44,92,34,107,115,92,34,58,49,50,56,44,92,34,116,115,92,34,58,54,52,44,92,34,109,111,100,101,92,34,58,92,34,99,99,109,92,34,44,92,34,97,100,97,116,97,92,34,58,92,34,92,34,44,92,34,99,105,112,104,101,114,92,34,58,92,34,97,101,115,92,34,44,92,34,115,97,108,116,92,34,58,92,34,80,106,83,79,105,105,97,57,84,67,77,61,92,34,44,92,34,99,116,92,34,58,92,34,51,104,119,109,66,98,119,81,55,121,47,102,115,106,107,61,92,34,125,34
*/
  var rencJson = JSON.parse(rencStr);
  var rinput = sjcl.decrypt(masterKey, rencJson);
  Browser.msgBox(rinput);
}

加密很好,我可以使用this tool 解密。 JSON.parse() 有问题。

【问题讨论】:

  • 把 JSON 打印出来,它是什么样子的?
  • 忘了说,我已经将 sjcl.min.js 内容包含到了谷歌脚本中。
  • 感谢@Corvusoft。解决方案是here
  • 没问题,尽情享受吧。

标签: javascript json google-sheets sjcl


【解决方案1】:
  var rencStr = Utilities.base64Decode(encB64);
/*
34,123,92,34,105,118,92,34,58,92,34,52,112,115,84,43,76,84,73,104,47,97,84,55,87,87,118,55,89,101,55,113,119,61,61,92,34,44,92,34,118,92,34,58,49,44,92,34,105,116,101,114,92,34,58,49,48,48,48,44,92,34,107,115,92,34,58,49,50,56,44,92,34,116,115,92,34,58,54,52,44,92,34,109,111,100,101,92,34,58,92,34,99,99,109,92,34,44,92,34,97,100,97,116,97,92,34,58,92,34,92,34,44,92,34,99,105,112,104,101,114,92,34,58,92,34,97,101,115,92,34,44,92,34,115,97,108,116,92,34,58,92,34,80,106,83,79,105,105,97,57,84,67,77,61,92,34,44,92,34,99,116,92,34,58,92,34,51,104,119,109,66,98,119,81,55,121,47,102,115,106,107,61,92,34,125,34
*/

如果你看一下,那不是 JSON。您是否可能错过了那个JSON.stringify(); 步骤?

如果不是 JSON,则无法解析。

【讨论】:

    【解决方案2】:

    使用Utilities.base64Decode() 解码时,如果您想取回字符串,则需要执行额外的步骤。如果您查看Google Scripts reference,它会说base64Decode 返回一个字节数组而不是字符串。查看您的代码,您的解码返回

    var rencStr = Utilities.base64Decode(encB64);
    /*34,123,92,34,105,118,92,34,58,92,34,52,112,115,84,43,76,84,73,104,47,97,84...*/
    

    这是您的字符串在 Unicode 中的数字表示。如果您按照参考建议通过Utilities.newBlob(rencStr).getDataAsString() 运行返回值,您将拥有可以解析回加密字符串的 JSON。

    【讨论】:

      猜你喜欢
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 2018-12-22
      相关资源
      最近更新 更多