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

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

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

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

PHP

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

Q&A

解決済

3回答

2691閲覧

JSON_ERROR_SYNTAXの原因がわからない

takg

総合スコア125

JSON

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

PHP

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

0グッド

0クリップ

投稿2018/04/04 11:49

編集2018/04/04 13:19

以下のように、PHPでJSONの読み込みを行っているのですが、JSON_ERROR_SYNTAXが出てしまいます。
正直、JSON書式のどこが間違っているのかよくわかりません。
どなたかご教授ください。

PHP

1$jsonUrl = "-----/hoge.json"; 2$json = file_get_contents($jsonUrl); 3$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN'); 4$obj = json_decode($json,true); 5json_last_error();

hoge.json(UTF-8)
{"data":[
{"first":"maki","family":"nishikino"},
{"first":"rin","family":"hoshizora"},
{"first":"hanayo","family":"koizumi"}
]}

(追記1)
jsonの内容を文字列としてPHPに直書きしたところ、問題なく動きました。
皆様の仰る通り、JSON書式の問題ではないようでした。
jsonファイル作成の過程で、文字コード等に問題があったのか確認しています。
(追記2)
試しにjsonファイルをUTF-8以外で作成してみたところ、動作しました。
JSONファイル作成に用いたエディタ、あるいは文字コード変換でなにか問題があったものと考えられます。

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

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

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

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

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

defghi1977

2018/04/04 12:06

JSONをFireFoxのJSON.parseに掛けたらエラーにはならなかったため, 原因はJSONの書式とは別の場所にあるのでは?
takg

2018/04/04 12:20

ご回答ありがとうございます。別の方のご回答への返信に記しましたが、jsonデコードまでは問題なく動作しているように思います。仰るように、JSONの書式に問題があるようには僕にも思えません。書式の不具合以外で、SYNTAX_ERRORが表示されるケースはあるのでしょうか?
defghi1977

2018/04/04 12:34

'UTF8'ってなってるけれど'UTF-8'じゃね?
takg

2018/04/04 12:39

確かに変ですね。ただ、'UTF-8'にしてみましたが特に変化はありませんでした、、、
guest

回答3

0

ベストアンサー

記憶なんですけど、mb_convert_encoding()って、UTF-8をUTF-8に変換しようとすると誤変換を起こすことがあったような…

なので、

PHP

1$enc = mb_detect_encoding($json, 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');

で、結果がUTF-8だったらmb_convert_encoding()しないでjson_decode()かける、みたいな事をすると行けたり行けなかったりするかもしれません…。

####追記

あと、このへん…

PHPのjson_encodeがUTF-8がエラーになってしまう時に対処方法

投稿2018/04/04 12:32

編集2018/04/04 12:33
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

takg

2018/04/04 13:02

ご回答ありがとうございます。 hoge.jsonはUTF-8で記載されておりましたので、仰るようなUTF-8->UTF-8の変換がなされているかもしれないと考え、 if(mb_detect_encoding($json)!="UTF-8"){ $json = mb_convert_encoding($json, 'UTF-8', 'ASCII,JIS,EUC-JP,SJIS-WIN'); } このように対処しましたが特に変化はありませんでした。 また、リンクも拝見いたしましたが、そもそも今回の場合は変換が行われていないため当てはまらないと判断しました。 保険的に記述していた文字コードの変換部分が、余計な誤解を招いてしまいました。 申し訳ありません。 あと、勉強になりました。ありがとうございます。
takg

2018/04/04 13:22

追記しましたが、試しにUTF-8以外でJSONを作成してみたところ、問題なく動きました。 おそらくこのあたりに今回の原因があると思われるので、ベストアンサーにさせて頂きます。 lucker様のご回答をもとにもう少し検証してみたいと思います。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2018/04/04 13:24

ベストアンサーもらったのは嬉しいけど、なんか釈然としないですね…。
guest

0

全角空白が入っているとかでは?

投稿2018/04/04 12:31

otn

総合スコア84423

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

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

takg

2018/04/04 13:14

ご回答ありがとうございます。 検索をかけてみましたが、混入はありませんでした。
guest

0

提示されたままのコードで動きましたが...。
$objに格納した時点で本当にhoge.jsonを読み込んでいるのかvar_dump()等で確認してみていただけますか

投稿2018/04/04 12:07

wp-h

総合スコア135

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

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

takg

2018/04/04 12:16

ご回答ありがとうございます。 mb_convert_encodingの時点でvar_dump($json)をかけると、 string(134) "{"data":[ {"first":"maki","family":"nishikino"}, {"first":"rin","family":"hoshizora"}, {"first":"hanayo","family":"koizumi"} ]}" 問題なく読み込めているのですが、 var_dump($obj)の結果はNULLとなります。 ですので、JSONデコードの過程のエラーであることは間違いないように思います。
deadjupiter

2018/04/04 12:24

134 bytes も無いように見えるけど、インデントでもしてんのけ?
takg

2018/04/04 12:31

特にインデントはしていません。byte数、変ですか?
wp-h

2018/04/04 13:14

あ、確かにbyte数が私が実行した際より多いですね。 改行コードはLFでもCRでも問題なかったのでファイルにBOMがついているかもしれませんね。
退会済みユーザー

退会済みユーザー

2018/04/04 13:17

改行コードがCR+LFだと普通に134byteになると思う…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問