2017-03-04 196 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

打印地图。它会告诉你什么键和值包含 –