我有这段代码:
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对象,然后能够调用对象变量,但只是不确定如何确切)
答案 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?