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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

jQuery

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

Q&A

解決済

1回答

5437閲覧

input type:fileで読み込んだjsonファイルをJavaScriptで処理したい。

WrongAccept

総合スコア10

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2020/08/03 14:07

##実現したいこと
input type:fileで読み込んだjsonファイルをJavaScriptで処理したい。

###ソースコード

javascript

1$('#upfile').change(function(){ 2 if (this.files.length > 0) { 3 var file = this.files[0]; 4 var reader = new FileReader(); 5 reader.readAsDataURL(file); 6 reader.onload = function() { 7 var data;//dataにjsonのデータを入れたい。 8 } 9 } 10});

##知りたいこと
reader.resultがDataURIなので、DataURIからJsonファイルを読み込む方法が知りたいです。
もしくはほかに方法があれば、HTML,JavaScriptでローカルから読み込んだJsonファイルをJavaScriptで処理する方法が知りたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

DataURI Scheme を解析するユーザ関数があれば対応できそうですね。

javascript

1 2 var file = this.files[0]; 3 var reader = new FileReader(); 4 reader.onload = function(event) { 5 console.log( event.target.result ); 6 var parsed = parseDataURL(event.target.result); //dataにjsonのデータを入れたい。 7 var json; 8 try { 9 json = JSON.parse( parsed.isBase64 10 ? bota(parsed.data) 11 : decodeURIComponent(parsed.data) 12 ); 13 } catch(e) { 14 // DataURLはJSONでなかった場合(ノーテーションのミスなど) 15 }; 16 console.log( json ); 17 } 18 reader.readAsDataURL(file);

JavaScriptは非同期処理ですので、イベントリスナでコールバック指定する実装の場合、
先にイベントリスナをアタッチしておくほうが安全と思います。

  1. 活用するオブジェクトのインスタンス生成 reader = new FileReader()
  2. イベントリスナ(読み込み完了後の処理)の定義 reader.onload = listener
  3. 読み込み開始メソッド実行(処理開始のトリガ) reader.readAsDataURL()

※ご質問のコードでは 1. 3. 2. の順に実行されています。
ブラウザ実装では問題ないように処理されていると思いますが、「読み込み完了後にイベントリスナを定義する事例」を想像できてしまう内容であり、不安が感じられます。

投稿2020/08/03 21:00

編集2020/08/03 21:03
AkitoshiManabe

総合スコア5434

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

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

WrongAccept

2020/08/04 07:55 編集

var parseDataURL = function( dataURL ){ var rslt = { mediaType : null, encoding : null, isBase64 : null, data : null }; if( /^data:([^;]+)(;charset=([^,;]+))?(;base64)?,(.*)/.test( dataURL ) ) { rslt.mediaType = RegExp.$1 || 'text/plain'; rslt.encoding = RegExp.$3 || 'US-ASCII'; rslt.isBase64 = String(RegExp.$4) === ';base64'; rslt.data = RegExp.$5; } return rslt; } $('#upfile').change(function(){ if (this.files.length > 0) { // 選択されたファイル情報を取得 var file = this.files[0]; var reader = new FileReader(); reader.onload = function(event) { console.log( event.target.result); var parsed = parseDataURL(event.target.result); //dataにjsonのデータを入れたい。 var json; try { json = JSON.parse( parsed.isBase64? bota(parsed.data): decodeURIComponent(parsed.data)); } catch(e) {}; console.log(json); } reader.readAsDataURL(file); } }); こういった感じでいいのでしょうか…(logにDataURIとunderfindが出てしまい…)
AkitoshiManabe

2020/08/04 08:11

console.log(json) が undefined になる原因は いくつも考えられます。 parseDataURL() の引数に渡す値が ユーザ関数内の正規表現にマッチしなかったことだけは確実ですので、console.log( event.target.result )の結果が「正しいDataURISchemeのフォーマットなのか」を確認してください。 dataURL のフォーマットに問題ないが、parseDataURL() 内の正規表現でマッチしないのであれば、正規表現を書き換えて対応する必要があります。
WrongAccept

2020/08/06 12:14

遅れてすみません… どうやらparsed.dataまではちゃんとDataURIを拾ってきてくれるんですが、JSON.parse()のところでUncaught SyntaxErrorが出てしまっているみたいです… parse.dataにはWw0KC...==が入っています。 event.target.resultはdata:application/json;base64,Ww0KC...==なのでおそらくあってるんですが
WrongAccept

2020/08/06 12:18

json=JSON.parse(atob(parsed.data)) にしたらいけました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問