2017-03-04 195 views
0

我有這樣的代碼:如何解析Java中的Google自定義搜索API響應?

public void googleSearch() throws Exception { 

    URL url = new URL(
      "https://www.googleapis.com/customsearch/v1?key=" + key + "&cx=" + cx + "&q=" + qry + "&alt=json&queriefields=queries(request(totalResults))"); 

    HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
    conn.setRequestMethod("GET"); 
    conn.setRequestProperty("Accept", "application/json"); 
    BufferedReader br = new BufferedReader(new InputStreamReader(
      (conn.getInputStream()))); 

    ObjectMapper mapper = new ObjectMapper(); 

    System.out.println("Output from Server .... \n"); 
    while ((output = br.readLine()) != null) { 
     Object obj = mapper.readValue(output, Object.class); 
     System.out.println(obj); 

    } 

    conn.disconnect(); 
} 

當我試圖解析來自谷歌使用傑克遜2 JSON響應,來管理數據返回。我只需要圖像鏈接和描述,但是,我根本無法獲取分析的數據。

com.fasterxml.jackson.core.io.JsonEOFException: Unexpected end-of-input: expected close marker for Object (start marker at [Source: {; line: 1, column: 1]) 
at [Source: {; line: 1, column: 3] 

如何分開我所需要的圖像鏈接和信息,並使其更易於管理:當我運行這段代碼我得到這個錯誤? (我假設通過解析JSON到一個Java對象,然後能夠調用對象變量,但只是不知道如何)

回答

0

您正在逐行讀取響應,併發送每行個人給傑克遜。因此,如果反應是這樣的

{ 
    "property1": "value1" 
    ... 
} 

傑克遜得到一個輸入JSON字符串"{"當然這是無效的。

你應該送全conn.getInputStream()傑克遜(果然,ObjectMapper有這樣的API)

,雖然我們是在它,parsong爲Object是不是一個好主意,因爲傑克遜的整點data bind api就是將json綁定到一個具體的(通常是用戶自制的)Java類。如果你真的想解析爲一個通用的容器,發送到Map傑克遜:

Map<String, Object> map = mapper.readValue(conn.getInputStream(), Map.class); 

...然後System.out.println也將正常工作。

另一種選擇是調用readTree()並使用JsonNode通用數據結構。

,雖然我們是在它,而不是解析長JSON結構,有你看着Google API Client Library for Java

+0

我該如何檢索JSON中的值?我已閱讀關於使用密鑰的信息,但我不知道Google響應中的密鑰。我試過System.out.println(map.get(「src」)); 但它只是打印null。 – QQuestions

+0

打印地圖。它會告訴你什麼鍵和值包含 –