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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

3回答

9426閲覧

配列をJSON.stringify⇒JSON.parseすると、サイトによって復元できないのは何故でしょう

CyberMergina

総合スコア295

JSON

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/10/24 09:34

編集2016/11/08 10:06

現在、自社サイトにて以下のスクリプトを流すと

var str = ['A', 'B']; var json_p = {}; var json = JSON.stringify(str); json_p = JSON.parse(json); console.log(typeof(json_p), json_p);
object ["A", "B"] // 求めてる結果

と、返ってきます。

ただ、とあるお客様のサイトだと

string ["A", "B"] // ちなみに、json変数の中身は "[\"A\",\"B\"]" となっておりました。

という結果が返ってきてしまいます。
※ ちなみに検証ブラウザは同じになります。

二重にJSON.parseをかければ取れてくるのですが、
最終手段かと思っております。

JSON.parseやJSON.stringifyの使い方が間違っているのでしょうか?
ご存知の方がいらっしゃいましたら、ご教授願います。

~追記~

お客様サイトと自社サイトのJSON.parse関数が異なるのに気づきました。
お客様サイトにはprototype.jsが入っておりました。
念のため追記します。※詳しくないので、調べてまいります

~追記2~

  • 「JSON.stringifyが2重実行となっていた」と判断した理由

まず、原因として「JSON.stringifyが2重実行となっていた」と判断した理由ですが、
1.自社で作成している同一のJSファイルを複数サイトが読み、扱っている。
2.ただし、同現象が発生したのは1サイトのみだった
といったところです。

念のため、開発者モードで「上記スクリプト」を流しましたが、
対象のサイトのみで発生していた模様でした。

JSON.stringifyを実行した時点で、結果が異なっていたため、
「JSON関数群自体が書き換わっているのではないか」と思い
console.dir(JSON.parse);で見たところ、オブジェクトの中身が異なっていたため
JSON関数群が書き換わっているのでは?と思いました。

  • 「prototype.js」を疑った理由

とりあえず、他のサイトとお客様サイトの違いを探した際に、一番最初に「prototype.js」に目を付けました。
(「歴史のあるJavaScriptの機能拡張できるモジュール」という認識を持っていたので)
手っ取り早く「prototyoe.js」が埋め込まれているサイトを探し、「上記スクリプト」を流すと
同じ現象が起きたため、「prototype.js」が原因か!と判断しました。(サイトがどれだったか見失いました・・・)

  • 現状

結論としては prototype.js が問題ではなさそうです。(おそらく)

ご回答を新たに頂き、もう一度確認しました。
prototype.jsが埋め込まれているサイトを見つけ、「上記スクリプト」を流すと問題なくパースできました。
※ 念のため、お客様サイトでもう一度確認しましたが、パースできておりません。

~追記3~

追記②で書いていた、「検証に使用したサイト様」を発見しました。
こちらのページ になります。

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

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

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

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

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

guest

回答3

0

二重にJSON.parseをかければ取れてくるのですが、
最終手段かと思っております。

現象は分かりましたが、下記理由に合点できません。

prototype.jsが読み込まれていたことが原因のようでした。
JSON.parseの関数の中身が変わってるみたいで、
配列を含んだ文字列のデコードに対応していなかったようです。

配列に対応していないのなら JSON.parse('["A", "B"]') の時点で SyntaxError になるはずです。
2回 JSON.stringify が実行されていた」と考えるのが自然だと思いますが、どのような検証を経てその結論に至ったのでしょうか。

JavaScript

1var array = ['A', 'B']; 2var json = JSON.stringify(JSON.stringify(array)); // JSON.stringify x 2 3 4console.log(json); // ""[\"A\",\"B\"]"" 5console.log(JSON.parse(json)); // "["A","B"]" 6console.log(JSON.parse(JSON.parse(json))); // ["A", "B"]

「そんな馬鹿な」と思うかもしれませんが、過去に JSON.stringify を2回実行したJSON文字列と格闘している質問者を見た覚えがあります。

Re: CyberMergina さん

投稿2016/11/07 13:58

編集2016/11/08 00:37
think49

総合スコア18164

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

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

CyberMergina

2016/11/08 09:59

原因と断定した理由を追記させて頂きました。 キチンと追記しておらず、申し訳ございません。 ありがとうございます。
guest

0

JSON の Polyfill を別名で作ってそれを使うようにしてみては?

【JSON - JavaScript | MDN】
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON#Polyfill

【GitHub - douglascrockford/JSON-js: JSON in JavaScript】
https://github.com/douglascrockford/JSON-js

【JSON 3】
http://bestiejs.github.io/json3/

投稿2016/11/07 03:54

kei344

総合スコア69407

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

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

CyberMergina

2016/11/08 10:02

コメントありがとうございます。 こういうものがあるのですね! 試しにwindow.JSONを一旦空にし、上書きしてみましたが 何故か変わらずでした・・・・
kei344

2016/11/08 10:19

別名で、というのは別の箇所から上書きされる可能性の無いもので処理してしまえばどうでしょう、ということなのです。なので上書きしても同じかと思います。
CyberMergina

2016/11/08 10:24

「別名で」を見逃しておりました・・・ 別名でもやってみましたが、結果は変わらずです。 もっと他のところが原因ということですかね・・・
guest

0

prototype.jsが読み込まれていたことが原因のようでした。
JSON.parseの関数の中身が変わってるみたいで、
配列を含んだ文字列のデコードに対応していなかったようです。

ひとまず、二重にparseをかければいけると思います。

投稿2016/10/24 09:55

編集2016/11/07 02:26
CyberMergina

総合スコア295

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

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

CyberMergina

2016/10/24 10:05

今度はparseがいかない模様です・・・ JSON.parseを二重にかけるしかないのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問