質問: 閲覧ありがとうございます。 今回、文書の投稿アプリを作ろうと考えており、そこで生じた問題について相談させていただきます。 Quillという、リッチテキストエディタのOSSを組み込んで使おうと考えています。Quillのエディタにユーザーに文章を 書いてもらいます。 QuillはJavascriptで動いていますが、ブラウザ上で文字の入力だけでなく、文字色を変えたり、太字にするなど、 文字の修飾が可能です。 ユーザーがQuillで入力した内容を、phpmyadminを用いて、DBに保存したいです。 Quillには、getContentsというAPIが用意されています。これは、DeltaというJSON型のオブジェクトを返します。 このオブジェクトをDBに保存したいです。 まずはphpmyadminのブラウザ上で、JSON型のカラムを作り、Deltaを直接挿入しようと試みました。 用いたDeltaオブジェクトは、Quillのドキュメントに載っていた、下のコードです。 > > { > > ops: [ > > { insert: 'Gandalf', attributes: { bold: true } }, > > { insert: ' the ' }, > > { insert: 'Grey', attributes: { color: '#cccccc' } } > > ] > > } > > > 挿入画面において、タブを確認すると、「カラム,データ型,関数,NULL,値」が並んでおり、関数とは何を指定すればいいのかわかりませんでした。 とりあえず、関数のところを空欄にして、挿入した結果、 「#3140 - Invalid JSON text: "Missing a name for object member." at position 4 in value for column 'contents.content'.」 というエラーが発生しました。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/31d8b15a9a7740b1f9cc8d12bc3d4fa0.png) そこで関数のところはセレクトボックスだったので、適当に関数を選んでみると、「ABS,ACOS,AES_DECRYPT,ASCII」などをできませんでしたが、 なぜか「BIN」という関数では挿入できました。 このような状況で、質問したいことは次の2点です。 1.そもそもphpmyadminでデータ型をJSONに設定して、保存する必要があるのか(TEXT型ではだめか) 2.必要がある場合、どのように保存すれば良いのか ーー ご質問頂いた点について、補足です。 phpmyadminのブラウザ上の管理画面で、JSON型で挿入しようと試みただけなので、コードは書いていません。一応、下のようなSQL文を実行したことになります。 ``` INSERT INTO `contents` (`contents`) VALUES ('{ ops: [ { insert: \'Gandalf\', attributes: { bold: true } }, { insert: \' the \' }, { insert: \'Grey\', attributes: { color: \'#cccccc\' } } ] }') ```
回答: それはエスケープシーケンスですね。 9.1.1 文字列リテラル おそらくphpMyAdminが自動で入れてくれているものでしょう。 つまり正しくエスケープしてくれようとしている・・・と見えます。 シングルクォーテーションをダブルクォーテーションに変えた場合はどうでしょう? ただJSONって結構形式にうるさいので、JavaScriptとしてはパースできてもJSONとしてはパースしてくれなかったりします。 JSONきれい 例えば上記ではすべてダブルクォートでくくったうえで、キー部分もダブルクォートにしないと「正しいJSON形式でした。」になりません。 ひとまず、ここでグリーンになったものでお試しを。