SyntaxError: Unexpected token < in JSON at position 4

投稿者: Anonymous

Google Apps Scriptについて

https://tonari-it.com/gas-api-weather/
上記、Webサイトを参考にJSONデータを配列に格納し、ログを出力しようとしましたが上手くいきません。
エラー内容は以下になります。

SyntaxError: Unexpected token < in JSON at position 4(行 5、ファイル「weatherForecast」)

エラー内容を読むと、5行目の書き方に誤りがありますが、「<」の意味がわかりません。
自分で長時間調べてみましたが、お手上げ状態です。ご教示お願い致します。
画像の説明をここに入力

function weatherForecast() {

var response = UrlFetchApp.fetch('http://weather.livedoor.com/forecast/webservice/json/v1?city=130010'); //URL+cityID

var json=JSON.parse(response.getContentText());

Logger.log(json['title']);
Logger.log(json['description']);
Logger.log(json['forecasts']);

}

解決

http://weather.livedoor.com/forecast/webservice/json/v1?city=130010
に実際にアクセスしてみましょう。

http://www.livedoor.com/?city=130010
にリダイレクトされてしまいますね。そしてWebページにおそらくライブドアのトップページが表示されています。つまりHTMLが返ってきてます。

ということで、 response.getContentText() で本来JSONが取得できるはずだったのですが、HTMLを取得してしまっているようです。

HTMLはJSONではありません。HTMLには<が含まれています。これがSyntaxError: Unexpected token < in JSONの原因です。

では、どうしてJSONではなくてリダイレクトされてHTMLが返ってきてるのでしょう?気になって調べてみました。サービスが終了しているからだと思います。

天気情報 ヘルプ – livedoor ヘルプ

2020年7月31日(金)14:00 をもちまして、「livedoor 天気」のサービス提供を終了いたしました。

終了したサービスを使うことはできません。

参考にされているページ 【Google Apps Script】天気予報をWeb APIで取得する方法 にJSONが載っています。

引用:

{“coord”:
{“lon”:145.77,”lat”:-16.92},
“weather”:[{“id”:803,”main”:”Clouds”,”description”:”broken clouds”,”icon”:”04n”}],
“base”:”cmc stations”,
“main”:{“temp”:293.25,”pressure”:1019,”humidity”:83,”temp_min”:289.82,”temp_max”:295.37},
“wind”:{“speed”:5.1,”deg”:150},
“clouds”:{“all”:75},
“rain”:{“3h”:3},
“dt”:1435658272,
“sys”:{“type”:1,”id”:8166,”message”:0.0166,”country”:”AU”,”sunrise”:1435610796,”sunset”:1435650870},
“id”:2172797,
“name”:”Cairns”,
“cod”:200}

ですので、これを使って下記のようにすると、すこし体験した気持ちになれると思います。
(下記のコードでは上記のダブルクォートが になっているのを私のほうで、"になおしています)

var text = '{"coord":{"lon":145.77,"lat":-16.92},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04n"}],"base":"cmc stations","main":{"temp":293.25,"pressure":1019,"humidity":83,"temp_min":289.82,"temp_max":295.37},"wind":{"speed":5.1,"deg":150},"clouds":{"all":75},"rain":{"3h":3},"dt":1435658272,"sys":{"type":1,"id":8166,"message":0.0166,"country":"AU","sunrise":1435610796,"sunset":1435650870},"id":2172797,"name":"Cairns","cod":200}';
var json = JSON.parse(text);
回答者: Anonymous

Leave a Reply

Your email address will not be published.