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

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

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

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

HTML

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

Q&A

解決済

2回答

9960閲覧

JSONの入れ子も含む、キーと値を取り出したいです。

skjdujr9djhf

総合スコア28

JavaScript

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

HTML

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

1グッド

0クリップ

投稿2018/05/10 06:37

前提・実現したいこと

①文字列の値からjson.parse()で文字列をJSONとして解析をする。
②JSONのキーと値を取得して、キーと値の表を作成したい。

例えば、以下のようなデータが来たら以下のような表を作成したいです。

{"test1":"aaa","test2":{"first_name":"tarou","last_name":"hanako"},"test3":{"email":"test@test.com","prefecture":"東京都"},"test4":"bbb"}

上記は1例ですが、キーが入れ子になっているケースや、入れ子の入れ子のケースも
考慮が必要です。

上記のデータでの表作成イメージ

項目
testaaa
first_nametarou
last_namehanako
emailtest@test.com
prefecture東京都
test4bbb

入れ子があるケースでは、どのようにキーと値を取り出せるのでしょうか。
現在色々と調べていますが、何か例を教えて頂けないでしょうか。

該当のソースコード

現状は入れ子が全くないパターンのデータを作成し以下のソースで、
特定のフィールドにキーと値が入った表を表示することは出来ています。

JavaScript

1 // dataは上記のサンプルデータのような文字列の値 2  // コメントはプログラム自体経験が浅いので間違っているかもしれないです。 3 4 // json解析 5 var obj = JSON.parse(data); 6 console.log(obj); 7 8 // jsonの要素数の取得 9 var json_count = Object.keys(obj).length; 10 console.log(json_count); 11 12 // objの配列の取得 13 var obj_key = Object.keys(obj); 14 var obj_values = Object.values(obj); 15 console.log(obj_key); 16 console.log(obj_values); 17 18 // 配列かどうかを調べる 19 console.log(Array.isArray(obj_key)); //true 20 console.log(Array.isArray(obj_key)); //true 21 22 // objのキーと値を格納するための空配列を定義 23 var key_box =[]; 24 var value_box =[]; 25 26 // HTMLの<tr>~</tr>のタグの文字列を作成(表の中身の部分の作成) 27 var cuntom = ""; 28 29 for (var i=0 ; i < json_count ; i++){ 30 key_box[i] = obj_key[i]; 31 value_box[i] = obj_values[i]; 32 cuntom = cuntom + "<tr><td>" +key_box[i]+ "</td><td>" +value_box[i]+ "</td></tr>"; 33 } 34 35 // 表作成 36 // 固定の部分(tableタグ、ヘッダ) 37 38 var before = "<table border=1>" + 39 "<tr><th>項目</th><th>値</th></tr>"; 40 var after = "</table>"; 41 42  //最後にbefore、after、customを足し合わせてHTMLの<table>~</table>を 43 //文字列としてフィールドの要素.innerHTMLに代入して、特定のフィールドに表示 44 45 フィールドの要素.innerHTML = before + custom + after; 46
august4056👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

たとえばこう

javascript

1var json='{"test1":"aaa","test2":{"first_name":"tarou","last_name":"hanako"},"test3":{"email":"test@test.com","prefecture":"東京都"},"test4":"bbb"}'; 2var a=JSON.parse(json); 3var b=[]; 4for(var i in a){ 5 if(typeof a[i]=="string"){ 6 b.push([i,a[i]]); 7 }else{ 8 for(var j in a[i]){ 9 if(typeof a[i][j]=="string"){ 10 b.push([j,a[i][j]]); 11 } 12 } 13 } 14} 15 16console.log(b);

入れ子の入れ子

arguments.calleeは無名関数を再帰処理するときの自分自身です
strictで使えないなら、名前を付けてやるのが手っ取り早いかもしれません

javascript

1var json='{"test1":"aaa","test2":{"first_name":"tarou","last_name":"hanako","test_test":{"test5":"xxx"}},"test3":{"email":"test@test.com","prefecture":"東京都"},"test4":"bbb"}'; 2var a=JSON.parse(json); 3var b=[]; 4(function(x){ 5 for(var i in x){ 6 if(typeof x[i]=="string"){ 7 b.push([i,x[i]]); 8 }else{ 9 arguments.callee(x[i]); 10 } 11 } 12})(a); 13console.log(b);

strict

javascript

1"use strict"; 2const json='{"test1":"aaa","test2":{"first_name":"tarou","last_name":"hanako","test_test":{"test5":"xxx"}},"test3":{"email":"test@test.com","prefecture":"東京都"},"test4":"bbb"}'; 3const a=JSON.parse(json); 4const b=[]; 5const func=(x)=>{ 6 for(var i in x){ 7 if(typeof x[i]=="string"){ 8 b.push([i,x[i]]); 9 }else{ 10 func(x[i]); 11 } 12 } 13}; 14func(a); 15console.log(b);

投稿2018/05/10 07:19

編集2018/05/10 09:25
yambejp

総合スコア114757

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

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

KazuhiroHatano

2018/05/10 07:27

>入れ子の入れ子のケースも考慮が必要です。 なのです
yambejp

2018/05/10 07:37

確かにそう書いてありますね 対応版書いておきました 「キーが入れ子」はちょっと意味がわかりません
KazuhiroHatano

2018/05/10 07:41

同じく、 {'hoge[fuga]':'piyo'}は{hoge:{fuga:'piyo'}}として解釈しろとかですかねぇ そいつぁヘヴィですね
KazuhiroHatano

2018/05/10 07:53

あぁ、もしかして入れ子になってるオブジェクト間で キー値が被ってる場合の回避策もちゃんとしてってことかな?
skjdujr9djhf

2018/05/10 08:14

回答ありがとうございます。 「キーが入れ子」というのはJSONの仕組みをよくわかっておりませんでした。 ネストの深さによらずキーと値を取得したいということです。 >yambejpさん else{ arguments.callee(x[i]); } の「arguments.callee(x[i]);」はどういう処理を行っているのでしょうか? x[i]のiを1つずつ減らし、0になるまで再帰呼び出しを行っているのでしょうか? またarguments.callee(x[i]);の処理で 「Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them」が表示されます。 上部に「"use strict";」と定義しているため、function内ではアクセス出来ないと言われていると思うのですが、何か解決策はあるでしょうか?
yambejp

2018/05/10 09:25

ちょっと対策してみました 確認してみて下さい
skjdujr9djhf

2018/05/11 01:05

修正後のソースで動作確認できました。 strictモードで無名関数を使う場合は、名前をつけてあげないといけないのですね。 また変数定義もvarしか知りませんでしたが、constで定義する方法も勉強になりました。 ありがとうございます。
guest

0

オブジェクトを元にtableのhtmlの文字列データを返す関数を作って再帰処理


追記

失礼、table書きたいわけじゃないんですね
まあ、どのみち再帰処理ってことに変わりないですが

別にyambejpさんのでいいというか
パフォーマンス的には無駄に変数が増えないあっちの方がいいんですが
自分は関数が外の変数をいじくるのが嫌い&
流用しやすいように作るのが好きなので別案

js

1 2 3var data='{"test1":"aaa","test2":{"first_name":"tarou","last_name":"hanako"},"test3":{"email":"test@test.com","prefecture":"東京都"},"test4":"bbb"}'; 4var obj=JSON.parse(data); 5obj=flatten_object(obj); 6console.log(obj); 7 8function flatten_object(obj){ 9 var rtn={}; 10 for(var i in obj){ 11 if(typeof obj[i]==='object'){ 12 Object.assign(rtn,flatten_object(obj[i])); 13 } 14 else{rtn[i]=obj[i];} 15 } 16 return rtn; 17}

投稿2018/05/10 06:47

編集2018/05/10 15:38
KazuhiroHatano

総合スコア7804

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

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

skjdujr9djhf

2018/05/14 05:01

別案で回答頂いたいたのに気が付きませんでした。 こういう書き方もあるんですね。 参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問