楽天のマンガ新刊APIでJSONのパース問題
create: 2019-12-20
JavaScript firebase cron

楽天ブックスでは、非公式ながら最新の発売マンガ一覧を提供してくれる API があります。
node.jsで取得するコードは簡単なのですが、何度やっても JSON パースエラーになります。

const rp = require('request-promise')
const url =
  'https://books.rakuten.co.jp/event/book/comic/calendar/2019/11/js/booklist.json'

rp.get(url, options).then(function(body) {
  JSON.parse(body) // ここでエラーになる
})

うーん、レスポンスのテキストをコピーして JavaScript オブジェクト作ってもエラーにならないのに・・・?

エラー情報を読み解いてみる

error Unexpected token in JSON at position 0 と出ているので、文字になんか問題がありそうです。
とりあえず先頭から文字コードを出力して確認してみます。

for (let i = 0; i < 5; i++) {
  console.log(i, json.charCodeAt(i))
}
0 65279
1 123
2 13
3 10
4 13

おや。1 文字目に変なのがいる。

1文字目は要らないんじゃない?

ってことで、1文字目を抜いてパースしてみました。

rp.get(url, options).then(function(body) {
  JSON.parse(body.substr(1)) // 1文字目を抜く
})

やった!
無事パースできました。

なにこれ嫌がらせ?