Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 由于输入结束,jackson无法映射空数组,且没有要映射到对象的内容_Java_Json_Jackson - Fatal编程技术网

Java 由于输入结束,jackson无法映射空数组,且没有要映射到对象的内容

Java 由于输入结束,jackson无法映射空数组,且没有要映射到对象的内容,java,json,jackson,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.Obj

我向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);
        }
        String line;
        while ((line = br.readLine()) != null)
        {
            sb.append(line);
        }

解决了问题。

将上述代码更改为

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

解决了问题。

将上述代码更改为

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

解决了这个问题。

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

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;

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

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;

如果流事实上有数据,我怀疑Jackson会这样做。我建议读取流并将数据打印到控制台,在那里您正在进行jackson反序列化,以确保此时确实有数据要读取。是的,您是对的,我并不总是向jackson提供我认为是的数据,我已经更新了问题。如果流事实上有数据,我怀疑jackson会这样做。我建议读取流并将数据打印到正在进行jackson反序列化的控制台,以确保此时确实有数据要读取。是的,你是对的,我并不总是向jackson提供我认为是的数据,我已经更新了问题。我目前正在使用ObjectMapper.readValue()它实际上可以接受一个输入流,所以我猜把它改成直接接受输入流也会有同样的效果?是的。如果需要读取多个单独的值或诸如此类的值,则只需要使用解析器。我目前正在使用ObjectMapper.readValue(),它实际上可以获取输入流,因此我猜将其更改为直接获取输入流也会有相同的效果?是的。只有在需要读取多个单独的值或类似值时,才需要使用解析器。