【问题标题】:How to parse Google Custom Search API response in Java?如何在 Java 中解析 Google 自定义搜索 API 响应?
【发布时间】:2017-03-04 20:20:34
【问题描述】:

我有这个代码:

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 对象,然后能够调用对象变量,但不确定如何准确)

【问题讨论】:

    标签: java json jackson google-custom-search google-search-api


    【解决方案1】:

    您正在逐行阅读回复,并将每一行单独发送给 Jackson。所以如果响应是这样的

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

    Jackson 得到一个输入 json 字符串 "{",当然这是无效的。

    你应该把整个conn.getInputStream()发给Jackson(果然ObjectMapper有这样的api)

    当我们这样做时,将其解析为 Object 并不是一个好主意,因为 Jackson 数据绑定 api 的全部意义在于将 json 绑定到 具体(通常是用户制作的) Java 类。如果你真的想解析成通用容器,发送Map到Jackson:

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

    ...那么System.out.println 也将正常工作。

    另一种选择是调用readTree() 并使用JsonNode 通用数据结构。

    当我们在做这件事时,你有没有研究过Google API Client Library for Java,而不是解析长的 json 结构?

    【讨论】:

    • 如何从 JSON 中检索值?我读过有关使用密钥的信息,但我不知道 Google 响应中的密钥是什么。我试过 System.out.println(map.get("src"));但它只是打印 null。
    • 打印地图。它会告诉你它包含哪些键和值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多