2013-12-07 1 views
0

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

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 
+1

Можете ли вы отправить полную трассировку стека вместе с линией, на которой появляется ошибка? –

+1

Я добавил сообщения об ошибках в соответствии с запросами. – gwar666

ответ

1

я, наконец, понял, главный недостаток после прохождения через добытого JSON. JSON Google был возвращающим массива из «элементов», а не через [] символов, поэтому после добавления списка в классе 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); 
4

Я думаю, что я прочитал около 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 для де-сериализации. Например, первая строка {или [или "сообщение": {, и это не является допустимым json JsonSyntax.

Наслаждайтесь :)

+0

Пробовал его, это дает еще одну ошибку: 'Исключение в нити«основной»com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: незавершенная объект в строке 1 колонки 14813' Для этой линии кода: 'final GResults results = new Gson(). fromJson (builder.toString(), GResults.class);' – gwar666

+0

Я думаю, что ваш JSON не очень хорошо сформирован, и вам нужно проверить свой json-формат, действуйте здесь http : //jsonformatter.curiousconcept.com/. вы можете разместить свой пример json здесь –

+0

@ gwar666 GSON выбрасывает эту конкретную ошибку, когда после конца объекта нет лишних символов, и он определяет узлы очень узко (как это делает спецификация JSON) - только \ t, \ n, \ r и пробел пробелы. Если вы не можете легко понять, что вызывает лишние символы в конце и устранить их, другой вариант - сообщить GSON о синтаксическом анализе в режиме смягчения: Gson gson = new Gson(); JsonReader reader = новый JsonReader (новый StringReader (result1)); reader.setLenient (true); –

 Смежные вопросы

  • Нет связанных вопросов^_^