如何解析Java中的Google Custom Search API响应?

时间:2017-03-04 20:20:34

标签: java json jackson google-custom-search google-search-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();
}

我试图使用Jackson 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对象,然后能够调用对象变量,但只是不确定如何确切)

1 个答案:

答案 0 :(得分:0)

您正在逐行阅读回复,并将各行发送给杰克逊。所以,如果响应是这样的

<h1>Hello, {{ name }}!</h1>

杰克逊获得输入json字符串{ "property1": "value1" ... } ,当然这是无效的。

你应该将整个"{"发送给杰克逊(确实,conn.getInputStream()有这样的api)

当我们在它的时候,解析为ObjectMapper并不是一个好主意,因为杰克逊数据绑定api的重点是将json绑定到具体(通常用户制作)Java类。如果您真的想要解析为通用容器,请向杰克逊发送Object

Map

...然后Map<String, Object> map = mapper.readValue(conn.getInputStream(), Map.class); 也能正常运作。

另一个选项是调用System.out.println并使用readTree()通用数据结构。

虽然我们在这里,而不是解析长json结构,你有没有看过Google API Client Library for Java