在Java中从Google自定义搜索输出解析的JSON结果

在Java中从Google自定义搜索输出解析的JSON结果,java,json,gson,google-custom-search,Java,Json,Gson,Google Custom Search,我试图在Java命令行中从Google自定义搜索输出一些结果(标题、url)以供测试,但我一直得到一个Java.io.EOFException错误。编译器列出了有问题的行,但我不知道要修改什么,即使花了几个小时寻找答案。我从一个关于堆栈溢出的现有问题中获取了大部分代码。感谢您的帮助 package google.api.search; import java.io.BufferedReader; import java.io.IOException; import java.io.InputS

我试图在Java命令行中从Google自定义搜索输出一些结果(标题、url)以供测试,但我一直得到一个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

我想在我注意到之前我已经读了大约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


享受:)

我想在我注意到之前,我读了大约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


享受:)

在查看原始JSON输出后,我终于发现了主要缺陷。Google的JSON通过
[]
符号返回了一个数组“items”,因此在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);
}

}
import java.util.List;
公共类结果{
公共字符串链接;
公共清单项目;
公共字符串getLink(){
返回链接;
}
公共列表getItems(){
退货项目;
}
公共无效设置链接(字符串链接){
this.link=link;
}
公共void集合组(列表项){
这个项目=项目;
}
公共空间获取(int i){
System.out.println(items.get(i));
}
公共字符串toString(){
返回字符串。格式(“%s”,链接);
}
}
在主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);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod(“GET”);
conn.setRequestProperty(“接受”、“应用程序/json”);
BufferedReader br=新的BufferedReader(新的InputStreamReader((conn.getInputStream()));
GResults results=new Gson().fromJson(br,GResults.class);

对于(int i=0;i我在查看原始JSON输出后终于发现了主要缺陷。Google的JSON通过
[]
符号返回一个数组“items”,因此在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);
}

}
import java.util.List;
公共类结果{
公共字符串链接;
公共清单项目;
公共字符串getLink(){
返回链接;
}
公共列表getItems(){
退货项目;
}
公共无效设置链接(字符串链接){
this.link=link;
}
公共void集合组(列表项){
这个项目=项目;
}
公共空间获取(int i){
System.out.println(items.get(i));
}
公共字符串toString(){
返回字符串。格式(“%s”,链接);
}
}
在主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);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod(“GET”);
conn.setRequestProperty(“接受”、“应用程序/json”);
BufferedReader br=新的BufferedReader(新的InputStreamReader((conn.getInputStream()));
GResults results=new Gson().fromJson(br,GResults.class);

对于(int i=0;我能不能请您发布完整的堆栈跟踪,以及错误出现的那一行?我已按要求添加了错误消息。您能不能请您发布完整的堆栈跟踪,以及错误出现的那一行?我已按要求添加了错误消息。尝试后,它会给出另一个错误:
异常ad“main”com.google.gson.JsonSyntaxException:com.google.gson.stream.MalformedJsonException:第1行第14813列的未终止对象对于此行代码:
final GResults results=new gson().fromJson(builder.toString(),GResults.class);
我认为您的JSON格式不正确,您需要检查JSON格式是否有效,请转到这里。您可以发布JSON示例吗here@gwar666当对象结尾后有非空白的额外字符时,GSON会抛出该错误,并且它定义的空白非常狭窄(正如JSON规范所做的那样)-仅\t、\n、\r,空格计为空白。如果您无法轻松找出导致末尾出现额外字符的原因并消除它们,另一个选项是告诉GSON以宽松模式进行分析:GSON GSON=new GSON();JsonReader reader=new JsonReader(new StringReader(result1));reader.setLenient(true);我直接从Google自定义搜索API获取JSON。我将尝试实现GSON-lenient模式。尝试此GSON-GSON=new-GSON();JsonReader=new-JsonReader(new-StringReader(builder.toString());reader.setLenient(true);GResults-result=GSON.fromJson(reader,GResults.class);尝试了一下,它给出了另一个错误:
线程“main”中的异常com.google.gson.JsonSyntaxException:com.google.gson.stream.MalformedJsonException:Unterminated对象位于第1行第14813列
对于这行代码:
final GResults results=new gson().fromJson(builder.toString(),GResults.class);
我认为您的JSON格式不正确,您需要检查JSON格式是否有效,请转到这里。您可以发布JSON示例吗here@gwar666当对象结尾后有非空白的额外字符时,GSON会抛出该错误,并且它定义的空白非常狭窄(正如JSON规范所做的那样)-仅\t、\n、\r,空格计为空白。如果您无法轻松找出导致末尾出现额外字符的原因并消除它们,另一个选项是告诉GSON以宽松模式进行分析:GSON GSON=new GSON();JsonReader reader=new JsonReader(new StringReader(result1));reader.setLenient(true);我直接从谷歌自定义搜索API获取JSON。我会试试imp