ITも大抵筋肉でなんとかなる

気が向いたら技術的なことも書くかもしれないですが、技術的なこと=ITとは限りません。

【GAS】JSON.parseでUnexpected tokenが出てハマったときの対処法

エラーメッセージ

…部分は省略を示す。

Uncaught SyntaxError: Unexpected token 
 in JSON at position 1063022
    at JSON.parse (<anonymous>)
…

対処法

エラーの発生原因になっているであろうJSON値をbase64に直す。
HACK: 別の解決方法があればなんとかしたい。

原因

謎の空白文字が存在していた。エラーメッセージをよく見ると空白文字が存在している。

背景

GASを使用してGoogle Drive上に配置されているJSON文字列を格納したテキストファイルを読み込んだのち、読み込んだJSON文字列をJSON.parseしたところ上記エラーがでた。下記の「JSON文字列について」で言及しているが、読み込んだJSON文字列は他のサービス・他のプログラムを使用して作成している。このプログラム自体はJSON文字列をJavaScript側で正常にparseできることを確認済みである。その確認を行なった後に改変は行なっていない。

JSON文字列について

  • JSON文字列を格納したテキストファイルは他のサービスからAPIを用い取得したJSON文字列である。
  • ただし取得したJSON文字列をそのままテキストファイルにしているわけではなく、取得後Pythonを使用し必要な要素のみを抜き出したものをテキストファイル化している。

原因の予測

他サービス内のAPIにて取得できる情報に何らかの変更が存在し、その影響でエラーが発生すると考えた。

検証

1. Google Drive上に保存されたJSON文字列をparserにかけてみる

JSONLint - The JSON Validator にかけてみたところ、エラーなし。

2. ローカル環境でJSON.parseを行なってみる

Virtualbox内のCentOSApacheをインストールし、実験用のコードとJSON文字列を保存したテキストファイルを配置する。配置後ブラウザで動作を確認する。

ブラウザで表示したところ、特にエラーは起きない。つまりローカルでの再現に失敗した。

考察

「原因の予測」にあるように他サービス内のAPIにて取得できる情報に変更があり、それが起因して空白文字が入ってしまったものと考えた。しかし実際はローカル環境では再現ができなかった。GASを使用して文字列を読み込んだときに、何らかの理由で空白文字が混入するような動きをしているようにも見える。断定的な結論は出せないが、少なくともローカル環境では再現されなかったことからGASに起因する問題なのではないかと結論付ける。

あとがき

意外とハマったので書きました。なぜローカル環境で再現しないのかは完全に謎です。ローカル環境で動かしてるときは妖精さんがエラーを起こさないよう頑張ってくれている可能性を検証する必要がありそうです(ない)。何をやってもエラーになるのでbase64に直すとかいう暴挙にでるという。ほんとうになんなんでしょう…。