29
35

More than 5 years have passed since last update.

階層化された JSON を再帰的に読み込む

Posted at

JSON は使いやすいフォーマットですが、近年何でも JSON フォーマットで表すため、階層化されて複雑な JSON データにでくわすことがあります。例えばこのような感じ。

{
  "title" : "name",
  "map" : {
    "mtitle1" : "mval1",
    "mtitle2" : "mval2"
  },
  "mid title" : "mvalue",
  "array" : [
    {"atitle1": "aval1", "atitle2": "aval2"},
    {"btitle1": "bval1", "btitle2": "bval2"}
  ],
  "end title" : "evalue"
}

このように、連想配列や通常の配列が混在していると、読み込むにはひと手間かかります。そこで、再帰的に一気に読み込みたいと思い、下記のようなコードを作成。

function plotres(response, prefix) {
  for (var key in response){
    if (typeof response[key] == "object") {
      if(Array.isArray(response[key])) {
        // 配列の場合は forEach で要素ごとにに再帰呼び出し
        response[key].forEach(function(item){
          plotres(item, prefix+" "+key) ;
        });
      } else {
        // 連想配列はそのまま再帰呼び出し
        plotres(response[key], prefix+" "+key) ;
      }  
    } else {
      // 配列や連想配列でなければキーの値を表示
      console.log(prefix+" "+key+": "+response[key]);
    }
  }
}

階層化されるごとに、その前の key をスペースで表示するようにしています。下記が実行結果。

> plotres(res, "")
 title: name
 map mtitle1: mval1
 map mtitle2: mval2
 mid title: mvalue
 array atitle1: aval1
 array atitle2: aval2
 array btitle1: bval1
 array btitle2: bval2
 end title: evalue

うまく再帰的に読み込むことができました。

29
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
35