2016-07-28 69 views
3

我正試圖訪問這個json文件:http://www.cloudpricingcalculator.appspot.com/static/data/pricelist.json與Java。JSON Url會返回其他內容嗎?

但是,當我讀它時,有時會給我一個JSON字符串(沒關係),有時會給我另外一個東西,而json.simple.parser會拋出一個Unexpected character(<) at position 0。 根據我在stackoverflow上讀到的內容,它可能會返回XML而不是JSON。由於我的網址是「json」,它怎麼可能?

這裏是我使用的代碼:

String baseUrl = "http://www.cloudpricingcalculator.appspot.com/static/data/pricelist.json"; 
... 
URL url = new URL(this.baseUrl); 
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
String l; 
String json = ""; 
System.out.println(url); 
while((l=in.readLine()) != null){ 
    System.out.println(l); 
    json+=l; 
} 
JSONParser parser = new JSONParser(); 
JSONObject jsonObject = (JSONObject) parser.parse(json); 

和日誌後面是很多廣場和未知的人物,如喲[S> E和錯誤Unexpected character() at position 0.

+1

可能它會返回給你json,但不完整,導致語法混亂。對我而言,這聽起來似乎比某個時刻返回JSON和XML是另一回事更合理。可能是錯誤的,但有趣的問題:) –

+1

我建議你在嘗試解析之前記錄結果 - 這樣你就可以看到發生了什麼,而不是猜測。你也應該使用'StringBuilder'而不是像這樣的字符串連接。 –

+0

如果我記錄結果,它給了我一些具有未知字符的東西,它以<和很多方塊開始 – Romain

回答

0

你是<沒有考慮從服務器返回的資源的壓縮和編碼。一個HEAD請求的響應如下:

[email protected]:~$ HEAD http://www.cloudpricingcalculator.appspot.com/static/data/pricelist.json 
200 OK 
Cache-Control: public, max-age=600 
Connection: close 
Date: Mon, 21 Aug 2017 12:02:14 GMT 
Age: 112 
ETag: "n_s_jQ" 
Server: Google Frontend 
Content-Encoding: gzip <---- *HERE* 
Content-Length: 7902 
Content-Type: application/json 
Expires: Mon, 21 Aug 2017 12:12:14 GMT 
... 

爲了避免這個問題,你可以用鏈接流轉換爲GZIPInputStream

GZIPInputStream gis = new GZIPInputStream(url.openStream()); 
BufferedReader in = new BufferedReader(new InputStreamReader(gis)); 
// ... 

和執行readline()時,將解壓縮返回的數據。