由于输入结束,jackson无法映射空数组而没有内容映射到Object

时间:2012-06-25 13:01:03

标签: java json jackson

我向api发送一个查询,并使用Jackson将json结果映射到我的班级。 当我得到一些结果时,它可以正常工作,但是当没有结果时它会失败

java.io.EOFException: No content to map to Object due to end of input
at org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2766)
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2709)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1854)
at com.jthink.discogs.query.DiscogsServerQuery.mapQuery(DiscogsServerQuery.java:382)
at com.jthink.discogs.query.SearchQuery.mapQuery(SearchQuery.java:37)*

但问题是api根本没有返回任何东西,所以我不明白它为什么会失败。

以下是查询:

http://api.discogs.com/database/search?page=1&type=release&release_title=nude+and+rude+the+best+of+iggy+pop

这就是我回来的原因

{
    "pagination": {
        "per_page": 50,
        "pages": 1,
        "page": 1,
        "urls": {},
        "items": 0
    },
    "results": []
}

这是我试图映射到

的顶级对象
public class Search
{
    private Pagination pagination;
    private Result[] results;

    public Pagination getPagination() {
        return pagination;
    }

    public void setPagination(Pagination pagination) {
        this.pagination = pagination;
    }

    public Result[] getResults() {
        return results;
    }

    public void setResults(Result[] results) {
        this.results = results;
    }
}

我猜这个问题与返回的结果数组是空白有关,但是看不出我做错了什么

编辑: 下面的评论是正确的,虽然我通常收到

{
    "pagination": {
        "per_page": 50,
        "pages": 1,
        "page": 1,
        "urls": {},
        "items": 0
    },
    "results": []
}

并且在这些情况下没有问题,但有时我似乎只是得到一个空字符串。现在我想知道问题是我从输入流中读取的方式

 if (responseCode == HttpURLConnection.HTTP_OK)
        InputStreamReader in= new InputStreamReader(uc.getInputStream());
        BufferedReader    br= new BufferedReader(in);
        while(br.ready())
        {
            String next = br.readLine();
            sb.append(next);
        }
        return sb.toString();
  }

虽然在得到响应代码之前我没有读过,但是第一次调用br.ready()时我可能会在它准备好之前调用它,因此我没有读取输入

编辑2:

将上述代码更改为

        String line;
        while ((line = br.readLine()) != null)
        {
            sb.append(line);
        }

解决了这个问题。

2 个答案:

答案 0 :(得分:1)

虽然已经有一个解决方案,但我建议您首先创建JsonParser,然后查看是否有任何输入,如果是,请使用数据绑定。这比逐行读取输入,构造String,然后将其交给解析器要快得多。

JsonParser jp = jsonFactory.createJsonParser(uc.getInputStream());
Search result = null;
if (jp.nextToken() != null) { // end-of-input
  result = jp.readValueAs(Search.class);
}
jp.close();
return result;

答案 1 :(得分:0)

将上述代码更改为

        String line;
        while ((line = br.readLine()) != null)
        {
            sb.append(line);
        }

解决了这个问题。