如何解析Java中的Google自定义搜索API响应?
问题描述:
我有这样的代码:如何解析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对象,然后能够调用对象变量,但只是不知道如何)
答
您正在逐行读取响应,并发送每行个人给杰克逊。因此,如果反应是这样的
{
"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?
我该如何检索JSON中的值?我已阅读关于使用密钥的信息,但我不知道Google响应中的密钥。我试过System.out.println(map.get(“src”)); 但它只是打印null。 – QQuestions
打印地图。它会告诉你什么键和值包含 –