48372


<https://qiita.com/r-yanyo/items/3ef153dac12e69a2c46c>

現在、上記の記事のコードを引用して、node.jsでJSON形式の値取得に関して勉強しています。

[code]

    const https = require('https');
    
    const req = https.request('https://randomuser.me/api/?        
        inc=gender,name,nat&format=PrettyJSON', (res) => {
            res.on('data', (chunk) => {
                console.log(`BODY: ${chunk}`);
        });
        res.on('end', () => {
            console.log('No more data in response.');
        });
    })
    
    req.on('error', (e) => {
    console.error(`problem with request: ${e.message}`);
    });
    
    req.end();
    
[/code]

今悩んでいる点としては、URL先のJSONの情報を全て取得し、表示することはできましたが、  
一部値（例えば、resultsの中のgender）を取得して表示することができない点です。

[code]

    console.log(`BODY: ${chunk}`);
    
[/code]

こちらを変更すれば良いとはわかっているのですが・・・色々なサイトを調べても書き方がわかりません。

JSON形式のデータは下記になります。

[code]

    {
    "results": [
    {
      "gender": "male",
      "name": {
        "title": "mr",
        "first": "anthony",
        "last": "sims"
      },
      "nat": "IE"
    }
    ],
    "info": {
    "seed": "e6467f8b01f0aeb0",
    "results": 1,
    "page": 1,
    "version": "1.2"
    }
    }
    
[/code]


CC BY-SA 4.0
2018-09-13T16:31:20.603
48371
2018-09-13T17:21:46.823
2018-09-13T16:45:36.277
24844
24844
question
node.js json
Node.jsでのJSON形式の値取得に関して


提示されたコードでは、変数`chunk`にJSONデータが **Buffer**
として入っている状態になっています。Bufferは要するにバイナリデータのことです。サーバーから送られてきたデータがそのままバイナリデータとして得られている状態になっています。  
JSON形式のデータの中身を取り出す一番簡単な方法は、データを **オブジェクト**
に変換することです。そのためには、まずBufferを[toStringメソッド](https://nodejs.org/api/buffer.html#buffer_buf_tostring_encoding_start_end)で文字列に変換し、それから[JSON.parse](https://developer.mozilla.org/en-
US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse)を使ってオブジェクトに変換します。

[code]

    const chunkString = chunk.toString();
    const obj = JSON.parse(chunkString);
    
[/code]

こうすると、変数`obj`には **オブジェクト**
となったJSONデータが入っている状態になります。`obj`を`console.log`で表示してみると、さっきとは少し違う形式でデータが表示されると思います。

[code]

    { results: [ { gender: 'female', name: [Object], nat: 'IR' } ],
      info: { seed: 'ba8616bc00098b3e', results: 1, page: 1, version: '1.2' } }
    
[/code]

これは、JSONデータがBufferや文字列ではなくオブジェクトとして得られている証拠です。

* * *

オブジェクトを得られたので、その中身のデータは通常のオブジェクトと同じように得ることができます。オブジェクトの扱い方についてまだご存知でない場合は、JavaScriptの基礎中の基礎ですから、お調べになることをお勧めします。  
例えば、`results`の中のデータを得るには`obj.results`とします。これは配列になっています。配列の要素は整数を添え字として取り出すことができます。0番目（一番最初）の要素を取り出すには`obj.results[0]`です。試しに`console.log(obj.results[0]);`としてみると、次のように表示されるはずです。

[code]

    { gender: 'male',
      name: { title: 'mr', first: 'neil', last: 'mills' },
      nat: 'IE' }
    
[/code]

これはまたオブジェクトになっています。これの`gender`フィールドを得るには、`obj.results[0].gender`とします。

* * *

一応例としてresultsの中のgenderを表示する方法までお答えしましたが、ポイントは回答前半の、JSONデータをオブジェクトで表されたデータに変換する部分だと思います。オブジェクトになった後のデータをどう読むかについては、そのデータで何をやりたいかに応じて変化します。  
例えば質問者さんは「resultsの中のgender」とおっしゃいましたが、resultsは配列なのでデータが複数入っている可能性もありますので、今回のように最初の要素に決め打ちするだけでなくfor文などを使って全部処理する必要があるかもしれません。

* * *

また、これは本題からは外れますが、この回答ではエラー処理を省略しています。例えばサーバーから得られたデータ（`chunk`）が正しいJSON形式でなかった場合はJSON.parseはエラーを発生させます。実務などに使う際はエラーの対処も必要となりますのでご注意ください。  
また、元のコードではJSONデータが複数のチャンクに分かれて得られた場合に対処できません。このコードを実際に用いる場合はそのような点も考慮する必要があるかと思います。


CC BY-SA 4.0
2018-09-13T17:12:06.197
48372
2018-09-13T17:21:46.823
2018-09-13T17:21:46.823
30079
30079
48371
answer