JSONでの文字のエスケープ ・ 値に「"」, 「 \」 を含める場合の記述方法

ペムノン
質問:JSONの値にダブルクォーテーションを入れたい
JSONの値に" (ダブルクォーテーション)を記述したいのですが、単純に文字を記述すると、うまく動作しませんでした。 どのようにダブルクォーテーションを表現するのでしょうか?

概要

JSONに" \ を含める場合には、エスケープの記述をします。 JSONでは以下の文字を値にとる場合はエスケープする必要があります。

エスケープが必要な文字 / エスケープでの文字の表現方法

エスケープ表記元の文字説明
\""ダブルクォーテーション
\\\バックスラッシュ
\//スラッシュ
\bバックスペース
\f改ページ
\nキャリジリターン(改行)
\rラインフィード
\tタブ
\uXXXX4桁の16進数で表記されたUnicode文字

実際のプログラムで使われるのは \" \\ \n \r \t が多いです。
補足
/ はエスケープしなくても動作するJSONファイルがあります。

コード例

例1

"/"はエスケープ処理し"\/"と記述します。
{
  "url":"http:\/\/www.ipentec.com"
}

例2

改行コードは "\r\n" とします。
{
  "memoe":"複数行の\r\nテキストの\r\nサンプルです。\r\n"
}

例3

""" は "\"" にエスケープします。
{
  "tag":"<img src=\"image01.jpg\"\/>"
}

例4

"\" は "\\" にエスケープします。
{
  "Path": "C:\\Windows\\notepad.exe"
}

A.W.S (Another World Story)

JSONでの文字のエスケープ ・ 値に「
終電が過ぎたコワーキングスペース。天井のライトは間引かれ、モニターの蒼白い光だけが机と紙コップを浮かび上がらせている。 外は粉雪。街灯に照らされた白い粒が渦を巻き、ときおり窓ガラスを撫でる氷混じりの音が、にわかに上がるキーボードの打鍵を伴奏していた。
フロントエンド担当の真矢は椅子をくるりと回し、背後のホワイトボードに貼ったポストイットを指で弾く。

「ねえ、航太。レスポンスがパースエラー吐いてる。たぶん文字列の中に紛れ込んだ“ダブルクォート”が犯人」

バックエンドの航太はカフェイン入りガムを噛みながら首をかしげる。
「JSON なら " を "" で逃がせば……って、それは CSV だっけ。待て、俺の脳までエスケープされてる」

インターンの順也がモニターを覗き込み、恐る恐る口を開く。
「JSON の場合は " を \" に、バックスラッシュそのものは \\ にしますよね」
「正解。だけど今回は JavaScript の文字列リテラルの中にさらに JSON がいる二重構造。だからソースコード上では…」
真矢はホワイトボードにさらさらと書き殴った。
const payload = "{\"path\":\"C:\\\\uploads\\\\image.png\"}";
「……と、こうやって四重のバックスラッシュを召喚しないと『C:\uploads』までたどり着けない」

 順也は思わず眉をしかめる。
「文字列なのに、記号が迷子防止の避難誘導灯みたいに並んでますね」

 航太が椅子を蹴る勢いで立ち上がり、腕を組む。
「ようするにだ。
― JSON では “ と \ を見つけたら前に一本、
― その JSON がコードの文字列に入るならさらに一本。
逃がして、逃がして、出口が見えたらまた逃がす。まるで深夜残業の俺たちじゃないか」

苦笑がこぼれ、窓の向こうで雪が激しさを増す。真矢はタブレットに描いた実装メモを確認しながら呟いた。
「エスケープって、“ここはデータであって制御じゃない”って印を付ける作業だよね。仕事で言えば『これは仕様外だから手ぇ出すな』って付箋貼るようなもの」

順也が肩をすくめる。
「でも付箋を貼りすぎて、どれが本当の仕様かわからなくなるのが新人の定番ミスです」

航太がにやりと笑い、ビルドスクリプトを叩く。ターミナルに “✔ All tests passed” の緑が灯るや、彼は両手を上げた。
「――ほら、バックスラッシュにも帰る家ができた」
真矢がブラウザをリロードすると、先ほどまで真っ赤だったコンソールは沈黙し、代わりに API から返った JSON を整形表示している。
{
  "message": "ファイル \"image.png\" を保存しました",
  "path": "C:\\uploads\\image.png"
}
雪の静けさが戻り、張り詰めていた空気が緩む。順也は紙コップを掲げた。
「じゃあ、解決祝いに自販機のホットココアでも――」

がたん、と廊下の自販機が動き、電子音が鳴った。液晶にはこう表示されている。
商品番号 "C2" は売り切れです
真矢が吹き出した。
「今度は自販機が JSON でオチを付けてきたよ」
航太がうなずく。
「逃がし忘れた“甘い期待”は、どこでもパースエラーってわけだな」
雪を噛んだような静けさのなか、三人はノート PC をたたんで立ち上がった。
自販機の淡い光を背にガラス扉を抜けると、途端に冷たい夜気がコートの隙間を割って入り込む。 航太が「タクシー拾う?」と振り向けば、真矢は首を横に振り、順也は凍えた手を擦り合わせる。
「こんな時間でも、あそこの味噌ラーメン屋はやってるんだ。コードの後は糖分より塩分だろ?」と真矢。 航太が笑い、「塩分より脂だって」と足を速める。順也も「じゃあ僕はバター増しで」と続き、三人の肩が雪を払うように揺れた。

こうして彼らは、凍える夜風に頬を刺されながらも、深夜営業のラーメン暖簾を目指して歩き出した。 テイクアウト用の JSON ならぬ“深夜のカロリー”を抱えて、次のデプロイと次の朝日に備えるために。
このページのキーワード
  • JSON エスケープ
  • JSON " 表記
  • JSON \ 表記
AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2013-08-24
Copyright © 1995–2025 iPentec all rights reserverd.