1

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": []
}

これがImがマップしようとしているトップレベルのオブジェクトです

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;
    }
}

問題を推測しているのは、返される結果の配列が空白になっていることと関係がありますが、Imが間違っていることを確認できません

編集:私は通常受け取りますが、以下のコメントは正しかったです

{
    "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);
        }

問題を解決しました。

4

2 に答える 2

1

JsonParserすでに1つの解決策がありますが、最初に作成してから入力があるかどうかを確認し、入力がある場合はデータバインドを使用するという代替案をお勧めします。これは、入力を1行ずつ読み取り、文字列を作成してからパーサーに渡すよりもはるかに高速です。

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;
于 2012-06-26T16:52:32.503 に答える
0

上記のコードを単純に変更する

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

問題を解決しました。

于 2012-06-26T09:14:10.917 に答える