pythonで、ghコマンドを叩いてGithubからデータを取得しようとしたある日のこと。
突然のJSONDecodeError
subprocess.runで次のghコマンドを叩きました。
gh issue list --json title,url
文字列のままでは扱いづらいため、json.loadsによってJsonにデコードすると
---------------------------------------------------------------------------
JSONDecodeError Traceback (most recent call last)
Cell In[123], line 18
16 # subprocessモジュールを使用してzshコマンドを実行
17 result = subprocess.run(["zsh", "-c", zsh_command], stdout=subprocess.PIPE, text=True).stdout
---> 18 JSON(json.loads(result))
(略)
JSONDecodeError: Expecting value: line 1 column 1 (char 0)
JSONDecodeErrorが発生しました。
レスポンスの文字列をよく見ても、コピーしてJson構文を機械的にチェックしてみても、おかしなところは見当たりません。では、いったいなぜ・・
JSONDecodeErrorの原因
文字が青色や緑色で着色されています(※Jupyter Labという開発環境での表示です)。これがJSONDecodeErrorを引き起こしている原因でした。
ANSIエスケープシーケンスと呼ばれる特殊コードを文字列に含めることによって実現されているようです。
JSONDecodeErrorの解決方法
下記コードによって、ANSIエスケープシーケンスを除去します。
def remove_ansi_escape_codes(text):
# ANSIエスケープコードを削除
ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
return ansi_escape.sub('', text)
これによって、json.loadsでJSONDecodeErrorになる問題を無事回避できました。

おわりに
標準出力の着色の仕組みを理解していないと、検討がつかず焦りますね。
コマンドを叩いた結果を処理するときは、ANSIエスケープシーケンスに気をつけましょう。
