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

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

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

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

4回答

15385閲覧

JavaScriptで持ってきたJSONファイル内の改行文字\nを、<br>に置換したい

kisuke-09

総合スコア13

JSON

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/01/10 06:14

前提・実現したいこと

いつもお世話になっております。
今回、外部においてあるjsonファイルを、JQueryのgetJSONで取得し、
用意してある配列に順番にpushしていくという処理を、
ファイル内に含まれている\nを、<br>に置換してpushするというように
改修したいと考えています。
色々調べながら実装してみましたがいまいちうまくいかず、
皆様の知見をお借りしたく思い、質問させていただきます。

発生している問題・エラーメッセージ

コンパイルエラーやメッセージは出ないものの、置換できていない

該当のソースコード

JavaScriptソースコード

1/* replacer関数 */ 2 function replacer(key,value){ 3 var str = new String(value); 4 str.replace(/\n/g, "<br>"); 5 console.log(str); 6  return str; 7 } 8 9 /* jsonファイルの取得関数 */ 10 function jsonLoader(){ 11 $.getJSON({ 12 type: 'GET', 13 url: 'jsonファイルの格納場所', 14 dataType: 'json', 15 async: false, 16 }).done(function(json, textStatus, jqXHR) { 17 JSON.stringify(json,replacer,"\t"); 18 console.log(json); 19 for(var i = 0; i < json.length; i++){ 20 myQuestions.push({ 21 'question': json[i].question, 22 'answers': json[i].answers, 23 'details': json[i].details, 24 'correctAnswer': json[i].correctAnswer 25 }); 26 }; 27 }).fail(function(jqXHR, textStatus, errorThrown){ 28 alert(errorThrown); 29 }); 30 }

試したこと

replace関数を用いてみましたがうまく動作しませんでした。
現在JSON.stringify(json,replacer,"\t");で定義したreplacer関数を呼び出していますが
うまくいっていません。

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

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

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

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

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

guest

回答4

0

javascript

1const a = {id:1, name:"adam\njohn"} 2console.log(JSON.stringify(a, (k,v) => (typeof v === "string") ? v.replace(/\n/g, "<br>") : v), "\t")

でできますが(kasa0様の回答をご参考に)、

javascript

1done(function(json, textStatus, jqXHR) { 2 JSON.stringify(json,replacer,"\t"); 3 console.log(json); 4 for(var i = 0; i < json.length; i++){ 5 myQuestions.push({ 6 'question': json[i].question, 7 'answers': json[i].answers, 8 'details': json[i].details, 9 'correctAnswer': json[i].correctAnswer 10 });

ここのところで、stringifyが成功しても、それを返り値として受けとって、parseしてjsonに再度格納しなければ、json[i]で取得できるのは置換前の値です。

投稿2019/01/10 06:28

papinianus

総合スコア12705

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

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

kisuke-09

2019/01/10 07:05

papinianus様 ご回答ありがとうございます。 stringifyはreplacer関数内で行い、JSON.parce(str)してからreturnするほうが良いでしょうか。
papinianus

2019/01/10 07:08

すみません。理解できません。 私の意図は、`json = JSON.parse(JSON.stringify(json, replacer));`みたいな意味です。 replacerはstrinfigyから呼ばれるコールバックなので、呼ばれた側であるreplacerで呼ぶ側の処理(stringify)するというのは矛盾しているように思えます。
kisuke-09

2019/01/10 07:36

勉強不足でした、申し訳ありません。 ご指摘ありがとうございます。 その方向で試してみます。
guest

0

正規表現が間違ってますよ。
改行コードの\nを取得したいなら、
\という文字列も含めるようにしないと。
kasa0さんの回答の再代入に関しても併せて、下記のようにします。

javascript

1str = str.replace(/\n/g, "<br>");

今のままだと、エスケープしたnを検索するって正規表現になってるのです。

投稿2019/01/10 07:18

編集2019/01/10 07:22
miyabi_takatsuk

総合スコア9528

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

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

kisuke-09

2019/01/10 08:03

miyabi_takatsuk様 ご回答ありがとうございます。 正規表現は自分も全く勉強できておらず、ご指摘いただけて助かりました。 どうも上記の方法でうまくいかないようなので解決には至りませんでしたが、 貴重なご回答、ありがとうございます。
miyabi_takatsuk

2019/01/10 09:32

なるほど。 replacer関数は通っていますか? 通っているなら、引数のvalueには何が入っていますか? valueはString型なのか、オブジェクト型なのか また、console.log(json); は何が出力されていますか? コンソールで何が出力されているか、 目的の関数が通っているかどうかも含めて、質問記載してみましょう。 今のところのやりとりだけでは、 スクリプトのどこを通って、どこを通ってないか、引数や変数に何が格納されているかが見えてきません。 それでは、的を射た回答は得られないかと思います。
guest

0

なんか別の言語と勘違いしていませんか?
PHPやJavaScriptは破壊メソッド、非破壊メソッドの区別がわかりにくいところがある言語なので、
公式リファレンス等を確認する癖を付けましょう。

質問文では下記の機能を利用していますが、JavaScriptでは両方とも非破壊メソッドです。
JavaScriptは公式サイトが超わかりにくいECMAScriptなので、
Firefox作ってる団体(Mozilla)が運営しているMDNを見るのが無難です。

String.prototype.replace
JSON.stringify

JavaScript

1// String.prototype.replace 2var a = "hogehoge"; 3console.log(a.replace(/eh/, "XX")); // "hogXXoge" 4console.log(a); // "hogehoge"

コンパイルエラーやメッセージは出ないものの、置換できていない
str.replace(/\n/g, "<br>");

str = str.replace(/\n/g, "<br>");にして一度確認してみてください。

投稿2019/01/10 06:28

miyabi-sun

総合スコア21158

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

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

kisuke-09

2019/01/10 07:00

miyabi-sun様 ご回答ありがとうございます。 確かに公式の記述ではわかりにくい部分も多々ありました。勉強になります。 ご指摘いただいて点について、修正しましたが、うまく動かない状態です。 ほかの回答者様の案も試しながら試行錯誤してみます。
guest

0

replaceは置換した結果を返すので、strへ再代入してやる必要があります。

str = str.replace(/\n/g, "<br>");

投稿2019/01/10 06:23

kasa0

総合スコア578

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

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

kisuke-09

2019/01/10 07:02

kasa0様 ご回答ありがとうございます。 再代入の必要について認識していませんでした。 ご助言いただきありがとうございます。 しかしながら、再代入してみたもののうまく動いていません。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問