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

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

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

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

PHP

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

Q&A

解決済

2回答

3007閲覧

phpでjsonデータを表示したい

zenobread

総合スコア44

JSON

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

PHP

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

0グッド

0クリップ

投稿2018/12/05 01:26

編集2018/12/06 02:27

jsonデータをphpで取り出して画面上に表示させたいのですが
エラーは出なくなったのにChromeブラウザで全く何も表示されません.
何か間違っているところはありますか?以下はそのコードと参考にしたサイト様です。

APItest.json

1{"res": 2 { 3 "odpt:stationTimetableObject":[ 4 { 5 "odpt:train":"odpt.Train:JR-East.Yamanote.350G", 6 "odpt:trainType":"odpt.TrainType:JR-East.Local", 7 "odpt:trainNumber":"350G", 8 "odpt:departureTime":"04:34", 9 "odpt:destinationStation":[{ 10 "odpt.Station":"JR-East.Yamanote.Osaki" 11 }] 12 } 13 ] 14 15 } 16}

APItest.php

1<?php 2$url = "http://localhost/php/APItest.json"; 3$json = file_get_contents($url); 4/* 5for($n=0;$n<=31;++$n){ 6 $json=str_replace(chr(127),"",$json); 7} 8$json=str_replace(chr(127),"",$json); 9if(0===strpos(bin2hex($json),'efbbbf')){ 10 $json=substr($json,3); 11} 12*/ 13$json = mb_convert_encoding($json,'UTF8','ASCII,JIS,UTF=8,EUC-JP,SJIS-WIN'); 14$arr = json_decode($json); 15$result=var_export($arr,true); 16echo $result; 17echo json_last_error(); 18echo json_last_error_msg(); 19print_r($json); 20 21if($arr==NULL){ 22 echo "MISS!"; 23 return; 24}else{ 25 $json_count=count($arr["res"]["odpt:stationTimetableObject"]); 26 $train=array(); 27 $traintype=array(); 28 $number=array(); 29 $time=array(); 30 $station=array(); 31 echo $json_count; 32 for($i=$json_count-1;$i>=0;$i--){ 33 $train[]=$arr["res"]["odpt:stationTimetableObject"][$i]["odpt:train"]; 34 $traintype[]=$arr["res"]["odpt:stationTimetableObject"][$i]["odpt:trainType"]; 35 $number[]=$arr["res"]["odpt:stationTimetableObject"][$i]["odpt:trainNumber"]; 36 $time[]=$arr["res"]["odpt:stationTimetableObject"][$i]["odpt:departureTime"]; 37 $time[]=$arr["res"]["odpt:stationTimetableObject"][$i]["odpt:destinationStation"][0]["odpt.Station:JR-East.Yamanote.Osaki"]; 38 39 } 40} 41echo $json_count; 42?>

とりあえずきちんと処理できているか試そうとechoで$json_countが動いているか
最後の行や途中のif文内で試しています

参考サイトはこちらです
https://qiita.com/fantm21/items/603cbabf2e78cb08133e

追記1
そもそも$arr===NULLのところで失敗してるようで
echo MISS! の文が実行されました。
いろいろしらべてJsonで何が間違っているかエラー文を出す
echo json_last_error();
echo json_last_error_msg();
を行ってみたところ
4Syntax error
と出てきました。
ここから先はまだ検証中です。

追記2
下のご回答者様の助力を得て
1、jsonファイルを読み込む方法
2、jsonファイルをphp内に埋め込む方法
2つで行う方法が分かりました。
以下はそのコードです。(jsonファイルは修正済みです)

APItest.php

1<?php 2$url = "http://localhost/php/APItest.json"; 3$json = file_get_contents($url); 4$json = mb_convert_encoding($json,'UTF8','ASCII,JIS,UTF=8,EUC-JP,SJIS-WIN'); 5$arr = json_decode($json,true); 6 7if($arr==NULL){ 8 echo "MISS!"; 9 return; 10}else{ 11 $json_count=count($arr["res"]["odpt:stationTimetableObject"]); 12 $train=array(); 13 $traintype=array(); 14 $number=array(); 15 $time=array(); 16 $station=array(); 17 for($i=$json_count-1;$i>=0;$i--){ 18 $train[]=$arr["res"]["odpt:stationTimetableObject"][$i]["odpt:train"]; 19 $traintype[]=$arr["res"]["odpt:stationTimetableObject"][$i]["odpt:trainType"]; 20 $number[]=$arr["res"]["odpt:stationTimetableObject"][$i]["odpt:trainNumber"]; 21 $time[]=$arr["res"]["odpt:stationTimetableObject"][$i]["odpt:departureTime"]; 22 $dest[]=$arr["res"]["odpt:stationTimetableObject"][$i]["odpt:destinationStation"][0]["odpt.Station"]; 23 } 24} 25echo $dest[0]; 26//以下はjson内のエラーを発見するメッセージ関数なので記入しないでも大丈夫です 27echo json_last_error(); 28echo json_last_error_msg(); 29?> 30//echo 結果 31//JR-East.Yamanote.Osaki0No error

APItest2.php

1<?php 2$j = '{"res": 3 { 4 "odpt:stationTimetableObject":[ 5 { 6 "odpt:train":"odpt.Train:JR-East.Yamanote.350G", 7 "odpt:trainType":"odpt.TrainType:JR-East.Local", 8 "odpt:trainNumber":"350G", 9 "odpt:departureTime":"04:34", 10 "odpt:destinationStation":[{ 11 "odpt.Station":"JR-East.Yamanote.Osaki" 12 }] 13 } 14 ] 15 } 16}'; 17$res = json_decode('http://localhost/php/APItest.json',true); 18$odpt_station="odpt:stationTimetableObject"; 19$odpt_train="odpt:train"; 20echo json_last_error(); 21echo json_last_error_msg(); 22echo $res->res->$odpt_station[0]->$odpt_train; 23?>

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

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

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

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

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

kunai

2018/12/05 01:37

何を表示したいんですか?echo $json_count;が全て表示されないということですか?if($arr==NULL){ のところに echo "It's NULL"とか出すようにしても何も出ませんか?
m.ts10806

2018/12/05 01:41

json_decodeの結果をvar_exportしてみてください
zenobread

2018/12/05 02:50

kunai様、$arr===NULLの部分にecho "MISS!"を追加したところそれは出てきたので、decodeするときに問題が出たんではないかと考えています。mts10806様、var_exportの結果をechoで返したところNULLが帰ってきました。
m.ts10806

2018/12/05 02:55

var_export自体、var_dumpの結果をarray形式で出力するだけなのでecho不要ですよ。ただ、nullならそもそも元のjsonの文法が怪しいですね。それか正しく取れてないか
guest

回答2

0

提示されたデータは正しいjsonになっていません
配列やオブジェクトの最終値にカンマをつけてはいけません

json

1{"res": 2 {"odpt:stationTimetableObject":[ 3 { 4 "odpt:train":"odpt.Train:JR-East.Yamanote.350G", 5 "odpt:trainType":"odpt.TrainType:JR-East.Local", 6 "odpt:trainNumber":"350G", 7 "odpt:departureTime":"04:34", 8 "odpt:destinationStation":[ 9 { 10 "odpt.Station":"JR-East.Yamanote.Osaki" 11 } 12 ] 13 } 14 ] 15 } 16}

投稿2018/12/05 02:16

yambejp

総合スコア114784

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

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

zenobread

2018/12/05 02:54

回答ありがとうございます。もともとyambejp様と全く同じデータを使っていたのですが、そのカンマを消すと追記1で変更したコードでは stdClass::__set_state(array( 'res' => stdClass::__set_state(array( 'odpt:stationTimetableObject' => array ( 0 => stdClass::__set_state(array( 'odpt:train' => 'odpt.Train:JR-East.Yamanote.350G', 'odpt:trainType' => 'odpt.TrainType:JR-East.Local', 'odpt:trainNumber' => '350G', 'odpt:departureTime' => '04:34', 'odpt:destinationStation' => array ( 0 => stdClass::__set_state(array( 'odpt.Station' => 'JR-East.Yamanote.Osaki', )), ), )), ), )), ))0No error{"res": { "odpt:stationTimetableObject":[ { "odpt:train":"odpt.Train:JR-East.Yamanote.350G", "odpt:trainType":"odpt.TrainType:JR-East.Local", "odpt:trainNumber":"350G", "odpt:departureTime":"04:34", "odpt:destinationStation":[{ "odpt.Station":"JR-East.Yamanote.Osaki" }] } ] } } Fatal error: Uncaught Error: Cannot use object of type stdClass as array in C:\xampp\htdocs\php\APItest.php:25 Stack trace: #0 {main} thrown in C:\xampp\htdocs\php\APItest.php on line 25 と出てきました。 結果は帰ってくるのですがエラーが出ます
yambejp

2018/12/05 03:07

json_decodeは第二引数にtrueをあたえると配列で返してくれます json_decode($json,true)
guest

0

ベストアンサー

stdClassであれば配列と言うよりオブジェクトなのでアクセスの仕方が変わります。

yambejpさんの仰るようにjson構文を直した上でこのような感じで。

php

1<?php 2$j = '{"res": 3 { 4 "odpt:stationTimetableObject":[ 5 { 6 "odpt:train":"odpt.Train:JR-East.Yamanote.350G", 7 "odpt:trainType":"odpt.TrainType:JR-East.Local", 8 "odpt:trainNumber":"350G", 9 "odpt:departureTime":"04:34", 10 "odpt:destinationStation":[{ 11 "odpt.Station":"JR-East.Yamanote.Osaki" 12 }] 13 } 14 ] 15 } 16}'; 17 18$res = json_decode($j); 19 20var_dump($res->res); 21$odpt_station = "odpt:stationTimetableObject"; 22var_dump($res->res->$odpt_station); 23var_dump($res->res->$odpt_station[0]); 24$odpt_train = "odpt:train"; 25echo $res->res->$odpt_station[0]->$odpt_train; 26

最後のechoの出力結果 : odpt.Train:JR-East.Yamanote.350G

※yambejpさんのコメントの通り配列に直したほうが扱いやすくはなりますので、あくまで「オブジェクトの参照の仕方」の参考として

投稿2018/12/05 03:02

編集2018/12/05 03:25
m.ts10806

総合スコア80850

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

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

zenobread

2018/12/06 02:03

ありがとうございます。おかげさまでechoの出力結果が望むものになりました。 ですのでベストアンサーに選ばさせていただきました。 ただいくつか質問があります。 $resとresにはどんな関係性がありますか?$resを$jsonに変更した場合色々Noticeが出てきました。 またphpファイルとjsonファイルを別に分けるにはどうすればよろしいですか? $urlからjsonファイルを取得する形だとSyntaxerrorが出てきます
m.ts10806

2018/12/06 02:11

> $resとres 何もありません。$resはただの変数。json_decode()の結果を受け取っている変数です。resはオブジェクトのメンバー(配列で言えばキーに当たる部分)です。 > またphpファイルとjsonファイルを別に分けるにはどうすればよろしいですか? $urlからjsonファイルを取得する形だとSyntaxerrorが出てきます 私はURLから取得する環境準備が面倒であるためテキスト固定でしましたので、正しくjsonデータが取り込めていた元の状態であると問題ないと思います。 ※回答にも書きましたがJSON構文の修正は必須です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問