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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Q&A

解決済

3回答

1944閲覧

つNodejsによるStack Overflow APIからのデータ取得

koji.kanao

総合スコア16

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

0グッド

0クリップ

投稿2016/03/23 19:15

編集2016/03/24 01:14

js

1var request = require('request'); 2var API = "https://api.stackexchange.com/2.2/users?page=1&order=desc&sort=reputation&site=stackoverflow"; 3 4request(API, function(err, response, body){ 5if( err || response.statusCode != 200 ) { 6 console.log("Error",err); return; 7} 8 9var stringify = JSON.stringify(body); 10var obj = JSON.parse(stringify); 11 12var items = obj.items; 13for (var i in items) { 14 var item = items[i]; 15 var display_name = item.display_name; 16 console.log("display_name", display_name); 17} 18 19});

Stack OverflowのAPIにアクセスして、JSONをダウンロードし、
ファイルの中身を表示するということをやりたいのですが、JSON.stringifyとJSON.parseのところに問題があるようで、どこをどのように修正すれば、APIからデータを取得できるでしょうか。
ご教示ください。

nodejs v5.4.1

result

shell

1}���8���h=��g����蘰]��*��qVwM�Ɔ$�L9%1����'��>ƾ�>�P"E�+�vI���;��l�����o��?�Lqg?��~�����j��>�Fb��?�.W�l�����z���ZϾa����3�7�|X�O0�>��~���U�����Ym��g+��}XWŲ\��Cav�+̸�T2������v���K8�~@��g�}���nYm>��f���Z;�.����;���6��g�p!���O�><�F�Y�/�>����7�S�޳������aIğ?�om�a��~ 2|���g�KQ�a�'�m�G�� ��-� �-���JBͻkw�f�*?���5�rs�|�� 3���v��,���ԏ�M�������r�pZ�ݙ���Ϲ\UOn�‰�]4�,>V�����<�XW�re?,��'�l�����n�j���L�lp��B�f�ҪB�B2k4/��@�����������nv˼��������b�}\�/6f�����n��<�Y�0K(f-f1C�2J�4� 4,(�A�r�i1�"����8fC+��e��f��A� +8Ɯ� �%L�$�j����A�`c��^�Ww�^�T/���w,������N�5�Yܙ����d��t,������rWW����+lu^LriTư(4URI�r�

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

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

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

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

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

guest

回答3

0

ベストアンサー

なんで?ってところはすでにterionさんが回答済みですので。実際どうするの?という所を。
callback側でgzipとjsonの処理を入れてもいいのですが、requestで処理する機能があるのでoptionsにgzipとjson使用を設定するとシンプルに書けるかなぁ。
詳しい所は、All Available Optionsgzipjsonを見てください。

url->options、optionsにgzipjson設定、JSON.parse処理削除。

JavaScript

1var request = require('request'); 2var options = { 3 uri: 'https://api.stackexchange.com/2.2/users?page=1&order=desc&sort=reputation&site=stackoverflow', 4 gzip: true, 5 json: true 6} 7request(options, function(err, response, body){ 8if( err || response.statusCode != 200 ) { 9 console.log("Error",err); return; 10} 11 12var items = body.items; 13for (var i in items) { 14 var item = items[i]; 15 var display_name = item.display_name; 16 console.log("display_name", display_name); 17} 18});

投稿2016/03/24 21:21

umed0025

総合スコア851

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

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

koji.kanao

2016/03/24 23:43

参照URLまで、ご教示いただきありがとうございます。
guest

0

まずはじめになのですが、上記コードをコピペしてローカルに持ってきて動きますでしょうか?
上記コードの場合だと、objの前にエラーが起きる気がします。

ちょっとリファクタリングみたいになってしまいますが、

javascript

1var request = require('request'); 2var API = "https://api.stackexchange.com/2.2/users?page=1&order=desc&sort=reputation&site=stackoverflow"; 3 4request(API, function(e//console.dir(body); //ココがコメントアウト? 5//正しいrequestの場合 6//request(options(urlでも可), function(err, response, body)(){ 7// function内にerr, response, bodyが入っているためこの中でif文とか書くことが出来る! 8//}) 9 10 11if( err || response.statusCode != 200 ) { //err, responseはどこから? 12 console.log("Error",err); return; 13} 14 15//上記を全て通過したら 16//初めてココでデバッグできる! 17//consoleとか出してデバッグ出来る! 18 19var stringify = JSON.stringify(body); 20var obj = JSON.parse(stringify); 21 22var items = obj.items; 23for (var i in items) { 24 var item = items[i]; 25 var display_name = item.display_name; 26 console.log("display_name", display_name); 27} 28 29});

なんか説教臭くなってしまってすいません!

で、諸々直した結果こうなりました。
こうするとobjまで言ってそこで吐き出されます。
ただ、ココで文字化けしてしまうのでそれを治す必要があるようです。

javascript

1 2var request = require('request'); 3var API = "https://api.stackexchange.com/2.2/users?page=1&order=desc&sort=reputation&site=stackoverflow"; 4 5request(API, function(err, response, body){ 6 if( err || response.statusCode != 200 ) { 7 console.log("Error",err); return; 8 } 9 10 var stringify = JSON.stringify(body); 11 var obj = JSON.parse(stringify); 12 13 console.log(obj); 14 15 var items = obj.items; 16 for (var i in items) { 17 var item = items[i]; 18 var display_name = item.display_name; 19 console.log("display_name", display_name); 20 } 21 22}); 23

ここまでですが、何か手助けになれば幸いです

投稿2016/03/24 00:54

MasakazuFukami

総合スコア1869

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

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

koji.kanao

2016/03/24 01:11

回答ありがとうございます。 投稿前の確認が不十分で誤ったコードを掲載していました。 掲載していただいたところまでは、自身で書いたのですが、 以降が期待するような結果にならないために、質問させていただこうと思った次第です。
guest

0

間違えている所が無いように見えます。

nodejs

1var stringify = JSON.stringify(body); 2var obj = JSON.parse(stringify);

JSON.stringifyは無くても良いです。

nodejs

1var obj = JSON.parse(body);

投稿2016/03/24 00:53

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/03/24 00:55

しかし、この行はなんでしょうね? エラーになると思うので、無視しています。 request(API, function(e//console.dir(body);
koji.kanao

2016/03/24 01:08

回答ありがとうございます。 request(API, function(e//console.dir(body); 失礼しました、誤ったコードを転載していました。ご指摘ありがとうございます。
退会済みユーザー

退会済みユーザー

2016/03/24 01:39

本当に文字化けしますね。 curl "https://api.stackexchange.com/2.2/users" と 、ブラウザで同じURLで見た時と、全然結果が違います。 文字化けしている理由は、なんと、"gzip"圧縮されているからでした。
MasakazuFukami

2016/03/24 11:03

下に回答したものです なるほど。。。 僕もしばらく考えたんですがなんでだろーーーってずっと思ってました(笑) まさかのgzip圧縮だったんですねーーーーー むむむむむ。。。。
koji.kanao

2016/03/24 23:42

terionさん 文字化けの原因のをご教示いただき。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問