2015-08-28 187 views
-1

以下程序我试图调用stackexchange api以获取JSON响应。JSONObject文本必须以'{'在2 [字符3第1行]开头

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.Reader; 
import java.net.URL; 
import java.nio.charset.Charset; 

import org.json.JSONException; 
import org.json.JSONObject; 

public class JsonReader { 

    private static String readAll(Reader rd) throws IOException { 
    StringBuilder sb = new StringBuilder(); 
    int cp; 
    while ((cp = rd.read()) != -1) { 
     sb.append((char) cp); 
    } 
    return sb.toString(); 
    } 

    public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException { 
    InputStream is = new URL(url).openStream(); 
    try { 
     BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); 
     String jsonText = readAll(rd); 
     JSONObject json = new JSONObject(jsonText); 
     return json; 
    } finally { 
     is.close(); 
    } 
    } 

    public static void main(String[] args) throws IOException, JSONException { 
    JSONObject json = readJsonFromUrl("https://api.stackexchange.com/2.2/users/4614124?order=desc&sort=reputation&site=stackoverflow"); 
    System.out.println(json.toString()); 
    } 
} 

当我运行这些我得到以下错误,但响应对象开始于{only。

Exception in thread "main" org.json.JSONException: A JSONObject text must begin with '{' at 2 [character 3 line 1] 
    at org.json.JSONTokener.syntaxError(JSONTokener.java:432) 
    at org.json.JSONObject.<init>(JSONObject.java:184) 
    at org.json.JSONObject.<init>(JSONObject.java:310) 
    at JsonReader.readJsonFromUrl(JsonReader.java:28) 
    at JsonReader.main(JsonReader.java:36) 
+1

返回的JSON的内容是什么?它是否以'{'开头? –

+0

'jsonText'在'new JSONObject(jsonText)'的内容是什么;' –

+0

是的,它以'{' –

回答

2

来自url的响应用Gzip压缩。在阅读之前,您需要解压输入流。这是通过用GZIPInputStream包装InputStream来完成的。

public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException { 
    InputStream is = new URL(url).openStream(); 
    GZIPInputStream gis = new GZIPInputStream(is); 
    try { 
     BufferedReader rd = new BufferedReader(new InputStreamReader(gis, Charset.forName("UTF-8"))); 
     String jsonText = readAll(rd); 
     JSONObject json = new JSONObject(jsonText); 
     return json; 
    } finally { 
     is.close(); 
    } 
} 
+0

非常感谢。像魅力一样工作。 –

相关问题