質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1489閲覧

【データフォーマット】シングルクオートとダブルクオートが混ざってるJSON(仮)のパース方法【PHP】

minamino

総合スコア7

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2020/02/05 13:59

編集2020/02/08 03:14

初心者です。

ゴール

APIから取り出したJSON風のデータ型から、
【JavaScript/CSS でカラオケ風テロップ表示】
https://pronama.jp/2015/03/20/karaoke-telop/
のように、
歌詞・タイムスタンプを『フレーズごとに個別に』取り出してJavascriptで
カラオケ風に表示する事。
※私が唯一まともに扱える言語がPHPのため、PHPの変数で受け取れるととても嬉しいです。
しかし、結論無理なら、
JSON.stringify
JSON.parse
といった関数を1から勉強してみます。

今回実現したい事

以下の型のファイルを、PHPでパースしたい

hoge.json

1[{'text': 'MIKAN', 'start': 0.4, 'duration': 0.867}, {'text': "Yesterday's B'z concert's very exciting.", 'start': 1.301, 'duration': 2.669}]

しかし、シングルクオートが混ざってるので、JSON(風)です。JSONにすればいいのに、との修正依頼ありがとうございます。私もスマートじゃ無いと思います。

さて、このままだと
大元のJSON(仮)ファイルの、各配列の括り方が、シングルクオートとダブルクオートが混ざり、エラーが出てしまいます。Pythonだと、literal_eval、というサポート関数があるようなのですが、PHPには、何かデータフォーマットを柔軟に読み込んでくれる書き方はありますでしょうか?

自分で試した事

foo.php

1ini_set('display_errors', "On"); 2$json= file_get_contents('hoge.json'); 3$data_list = json_decode($json, true); 4foreach ($data_list as $data) { 5 echo $data['text'] .PHP_EOL; 6}

エラー文

Warning: Invalid argument supplied for foreach() in /var/www/html/tera.php on line 5

読みこむJSON(仮)ファイル内の、全体を
str_replaceでダブルクオートに置換して、シングルクオート(だった箇所のみ)エスケープするですとか、、、
なんなり方法はありそうですが、よりスマートな方法をご教授くださいませ。
このファイル形式を正しくはなんと言うのかも、合わせてご指導頂けると嬉しいです。
宜しくお願い致します。

その後試した事

無理やり置換処理。しかし、文字列にクオートが混ざった段階で、どこかで破たんする

foo.php

1$content=str_replace("\"","'",$content); 2$content=str_replace("{'","{\"",$content); 3$content=str_replace("': ","\": ",$content); 4$content=str_replace(": '",": \"",$content); 5$content=str_replace("'}","\"}",$content); 6$content=str_replace("', 'start","\", \"start",$content); 7$content=str_replace("', 'text","\", \"text",$content); 8$content=str_replace("', 'duration","\", \"duration",$content); 9$content=str_replace(", 'start",", \"start",$content); 10$content=str_replace(", 'text",", \"text",$content); 11$content=str_replace(", 'duration",", \"duration",$content); 12$content=str_replace("\'","'",$content); 13$content=str_replace(",'",",\"",$content); 14$content=str_replace("}, {","},\n {",$content);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/05 16:37

キーや値をシングルクオートで囲ってるものは規約上jsonとは呼びません
退会済みユーザー

退会済みユーザー

2020/02/05 23:08

仕様から外れたもののパースは、採用されている仕様が明確にならない限り無理だと思います。 てか、なんで json にしないんだろ。。。 その時点でスマートではないです。
thyda.eiqau

2020/02/07 17:50

PHPでパースできたとしたら、そのデータを何に使うのでしょうか。絶対にPHPの変数で受け取れないと駄目ですか?
minamino

2020/02/08 10:44

te2jiさん、asahina1979さん、thyda.eiauさん、ありがとうございました。質問する事でJavascriptの値の扱い方を学ぶ良い機会になりました。
guest

回答1

0

ベストアンサー

このファイル形式を正しくはなんと言うのかも、合わせてご指導頂けると嬉しいです。

強いて言うならJavaScriptのオブジェクトっぽいです。最終的に動的処理に使うのであればどのみちPHPだけでは実現できないので、最初からJavaScriptで受け取ってしまえばいいと思います。

JSONPっぽいなと思ったので、次のコードでなんとかなる気がします (未検証) が、スマートじゃないので元データの設計変更できるならやったほうがよいです。 (そもそも元データをJSONにできるのなら、PHPは不要でJavaScriptから fetch 等で直接取得すればよいですが)

あと、このデータに危険なコードは絶対に混入しないという前提は必ず守る必要があります。第三者が編集できるのであれば深刻なXSSの脆弱性がありますので実行しないでください。

php

1<!doctype html> 2<html> 3<head> 4 <meta charset="UTF-8"></head> 5<body> 6<script> 7const source = <?= file_get_contents('hoge.json') ?: 'null'?>; 8console.log(source); 9</script> 10</body> 11</html>

投稿2020/02/08 04:18

thyda.eiqau

総合スコア2982

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/08 04:34

そもそも「 JSON : JavaScript Object Notation 」もどきだからね
thyda.eiqau

2020/02/08 04:39

現状「JavsScriptのオブジェクトっぽい記法のデータっぽい記法のデータ」となってしまってなんとも言えないですね
minamino

2020/02/08 10:49

解決いたしました。te2jiさん、asahina1979さん、thyda.eiauさん、ありがとうございました。 1:thydaさんのサンプルで、Javascript側での値の扱い方を勉強できた 2:API側の仕様をよく読んで、JSON形式の出力を実現できた(結果的にPHPでもJavascriptでも出力結果を扱えるようになり、ゴールに一歩近づいた という次第です。 すばらしいご指導ありがとうございました。心からお礼申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問