Node.jsでAPIから取得したJSON（ネストあり）を扱う

メディア芸術データベースのAPIを使用してJSONデータを取得したものの、Node.jsでネストありのJSONデータを扱う方法に少し手間取ったため備忘録。
Node.jsでAPIデータ取得→ネストありのJSONデータの扱いについての記事がなかったため残します。

## メディア芸術データベース
文化庁がマンガやアニメ、ゲームといったメディア作品の情報を保存し、ベータ版としてデータベースを公開している。

- 検索サイト

[https://mediaarts-db.bunka.go.jp/](https://mediaarts-db.bunka.go.jp/)

- データベースについて

[https://mediaarts-db.bunka.go.jp/about#anc02](https://mediaarts-db.bunka.go.jp/about#anc02)


## APIで取得したJSONの形式

```json:saenai-heroine-no-sodatekata.json
{"hitnum":1,
"record":[{"fieldId":"animation",
           "categoryId":"an-col",
           "subcategoryId":"an207",
           "aipId":"C15461",
           "metadata":{"rdf:type":["Collection"],
                       "schema:additionalType":["an"],
                       "schema:genre":["テレビレギュラーアニメシリーズ"],
                       "schema:name":["冴えない彼女*の 育てかた[ヒロイン]"],
                       "schema:name xml:lang=\"ja-Hrkt\"":["サエナイヒロインノソダテカタ","サエナイカノジョノソダテカタ"],
                       "schema:creator":["[監督]亀井幹太"],
                       "schema:contributor":["[シリーズ構成]丸戸史明 ／ [監督]亀井幹太 ／ [キャラクターテザイン] ／ [キャラクターテザイン、総作画監督]高瀬智章 ／ [美術監督]日下部夏月 ／ [美術設定]綱頭瑛子 ／ [音響監督]藤田亜紀子 ／ [音楽]百石元（F.M.F） ／ [アニメーション制作]A-1 Pictures ／ [制作]冴えない製作委員会 ／ [制作]アニプレックス ／ [制作]フジテレビジョン ／ [制作]KADOKAWA富士見書房BC ／ [制作]京楽産業ホールディングス ／ [制作]関西テレビ放送 ／ [制作]電通 ／ [制作]グッドスマイルカンパニー ／ [制作]コスパ"],
                       "schema:actor":["【安芸倫也】松岡禎丞 ／ 【澤村・スペンサー・英梨々】大西沙織 ／ 【霞ヶ丘詩羽】茅野愛衣 ／ 【加藤恵】安野希世乃 ／ 【氷堂美智留】矢作紗友里 ／ 【波島伊織】柿原徹也 ／ 【波島出海】赤崎*千夏 ／ 【石巻基予】大地葉 ／ 【里見梓】奥野香耶 ／ 【上郷喜彦】内田雄馬 ／ 【町田苑子】桑島法子 ／ 【加藤圭一】斉藤壮馬 ／ 【澤村小百合】中原麻衣 ／ 【水原叡智佳】田辺留依 ／ 【姫川時乃】鈴木絵理 ／ 【森丘藍子】大地葉"],
                       "schema:publisher":["CX"],
                       "schema:datePublished":["2015-01-09"],
                       "schema:startDate":["2015-01-09"],
                       "schema:endDate":["2015-03-27"],
                       "ma:type":["レギュラー"],
                       "schema:isPartOf":["C5951"],
                       "ma:media":["TVレギュラー"],
                       "ma:Effect":["アニメ"],
                       "ma:periodDisplayed":["00時50分 ／ フジテレビで放映 ／ 30分枠"],
                       "ma:runtime":["30分"],
                       "ma:volumeNumber":["13"],
                       "ma:originalCreator":["［原作］丸戸史明"],
                       "ma:contributor":["[アニメーション制作]A-1 Pictures ／ [制作]冴えない製作委員会 ／ [制作]アニプレックス ／ [制作]フジテレビジョン ／ [制作]KADOKAWA富士見書房BC ／ [制作]京楽産業ホールディングス ／ [制作]関西テレビ放送 ／ [制作]電通 ／ [制作]グッドスマイルカンパニー ／ [制作]コスパ"],
                       "ma:source":["CRNT2015（カレント2015新規登録）"],
                       "madbdata:oldDateModified":["2016-04-01T11:44:40"]}
                      }
          ]
}
```

メディア芸術データベースで1件だけヒットさせた結果が上記の通りである。
「"record"」キー配下に検索でヒットした結果のレコードが配列的に格納される。

この記事では、「"record"」キー配下の「"metadata"」の中の「"schema:name"」のValueを扱いたい！みたいな時のやり方の備忘録である。

## Node.js(express)のコード（APIで取得→配列に格納→コンソール出力）

```javascript:index.js
const express = require('express');
const bodyParser = require('body-parser');
const https = require('https');

// define the Express app
const app = express();

//メディア芸術データベースAPIのURL
const mediaartsdbAPI = 'https://mediaarts-db.bunka.go.jp/api/search?aipId=C15461';

// use bodyParser to parse application/json content-type
app.use(bodyParser.json());

// アプリケーションの「http://localhost:4000/」にアクセスすると、メディア芸術データベースへHTTPでGETしにいく。
app.get('/', (req, res) => {
    //GETしたJSON（バイナリ）をテキスト化&JSONパースし格納するための変数。
    let mediaartsdbRec1 = '';
    //「"record"」配下の要素を格納するための配列。
    let mediaartsdbRec2 = [];
    
    const mediaartsdbGet = https.request(mediaartsdbAPI, (res) => {
        let buf = [];
        res.on('data', (chunk) => {
            buf.push(chunk);
            //bufにはバイナリの配列の形でJSONが格納される。
        });
        res.on('end', () => {
            //バイナリをテキスト化し、それをJSONパースする。
            mediaartsdbRec1 = JSON.parse(buf.toString());

            //「"record"」の要素を配列に格納していく。
            for (j in mediaartsdbRec1['record']){
                mediaartsdbRec2.push(mediaartsdbRec1['record'][j]);
            }
            console.log(mediaartsdbRec2[0]['metadata']['schema:name']);
            console.log('JSONデータは以上です。');
        });
    })
    mediaartsdbGet.on('error', (e) => {
        console.error(`エラーが出ました： ${e.message}`);
      });
    mediaartsdbGet.end();
    res.send(mediaartsdbRec2);
});

// start the server
app.listen(4000, () => {
  console.log('listening on port 4000');
});
```


http://localhost:4000/にブラウザでアクセスした時のコンソール実行結果



```
/App/backend # node src
listening on port 4000
[ '冴えない彼女*の 育てかた[ヒロイン]' ]
JSONデータは以上です。
```

「"record"」キー配下の「"metadata"」の中の「"schema:name"」のValueをconsole.logで表示できました。
あとは同じようにして変数に入れるなりすれば活用できるかと。