Вывод проанализированных результатов JSON из пользовательского поиска Google в Java

Я пытаюсь вывести некоторые результаты (название, URL-адрес) из пользовательского поиска Google в командной строке Java для тестирования, но постоянно получаю сообщение об ошибке java.io.EOFException. Компилятор перечисляет ошибочную строку, но я не могу понять, что изменить, даже после нескольких часов поиска ответа. Я взял большую часть кода из существующего вопроса здесь о переполнении стека. Любая помощь приветствуется.

package google.api.search;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import com.google.gson.Gson;

class GSearch {

public static void main(String args[]) throws IOException  {
   String key = ""; //replace with API key
   String qry = ""; // search key word
   String cx = ""; //replace with cx
   URL url = new URL ("https://www.googleapis.com/customsearch/v1?key=" +key+ "&cx=" +cx+ "&q=" +qry+ "&alt=json");

   HttpURLConnection conn = (HttpURLConnection) url.openConnection();
   conn.setRequestMethod("GET");
   conn.setRequestProperty("Accept","application/json");
   BufferedReader br = new BufferedReader(new InputStreamReader ( ( conn.getInputStream() ) ) );

   String output;
   {while ((output = br.readLine()) != null){
       GResults results = new Gson().fromJson(output, GResults.class);
       System.out.println(results);
   }   
   conn.disconnect(); 
   }  
   }
}

Класс GResults:

public class GResults {

String title;
String link;

public GResults(String title, String link) {
    this.title = title;
    this.link = link;
}

public String getTitle(){
    return title;
}

public String getLink(){
    return link;
}

public void setTitle(String title){
    this.title = title;
}

public void setLink(String link){
    this.link = link;
}

public String toString(){
    return ("Title:%s, Link:%s", title, link);
}   
}

Строка ошибки:

GResults results = new Gson().fromJson(output, GResults.class);

Сообщения об ошибках:

Exception in thread "main" com.google.gson.JsonSyntaxException: java.io.EOFException: End of input at line 1 column 2
at com.google.gson.Gson.fromJson(Gson.java:813)
at com.google.gson.Gson.fromJson(Gson.java:768)
at com.google.gson.Gson.fromJson(Gson.java:717)
at com.google.gson.Gson.fromJson(Gson.java:689)
at google.api.search.GSearch.main(GSearch.java:26)
Caused by: java.io.EOFException: End of input at line 1 column 2
at com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:1377)
at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:483)
at com.google.gson.stream.JsonReader.hasNext(JsonReader.java:403)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:166)
at com.google.gson.Gson.fromJson(Gson.java:803)
... 4 more

2 ответа

Решение

Я, наконец, разобрался с основным недостатком, пройдя необработанный вывод JSON. Google JSON возвращал массив "предметов" вместо этого через [] символы, так что после добавления List в классе GResults так:

import java.util.List;

public class GResults {

public String link;
public List<GResults> items;

public String getLink(){
    return link;
}

public List<GResults> getItems(){
    return items;
}

public void setLink(String link){
    this.link = link;
}

public void setGroups(List<GResults> items){
    this.items = items;
}

public void getThing (int i){
    System.out.println(items.get(i));
}

public String toString(){
    return String.format("%s", link);
}

}

Мне удалось вернуть серию ссылок с помощью следующей команды в основной класс GSearch:

   HttpURLConnection conn = (HttpURLConnection) url.openConnection();
   conn.setRequestMethod("GET");
   conn.setRequestProperty("Accept","application/json");
   BufferedReader br = new BufferedReader(new InputStreamReader ( ( conn.getInputStream() ) ) );
   GResults results = new Gson().fromJson(br, GResults.class);

   for (int i=0; i<10; i++)
   results.getThing(i);

Я думаю, что прочитал это около 20 раз, прежде чем я заметил, вот правильный код

    final StringBuilder builder = new StringBuilder(50);
    String output;
    while ((output = br.readLine()) != null) {
        builder.append(output);
    }   
 final  GResults results = new Gson().fromJson(builder.toString(), GResults.class);

Gson создает правильное исключение, потому что вы читали строку за строкой и передавали эту строку gson для десериализации. Например, первая строка - это {или [или "message": {, и это не допустимый Json JsonSyntax.

Наслаждаться:)

Другие вопросы по тегам