AsyncTask 预期为 BEGIN_OBJECT,但在第 1 行第 2 列路径 $ 处为 BEGIN_ARRAY

Posted

技术标签:

【中文标题】AsyncTask 预期为 BEGIN_OBJECT,但在第 1 行第 2 列路径 $ 处为 BEGIN_ARRAY【英文标题】:AsyncTask Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $ 【发布时间】:2020-09-26 22:17:35 【问题描述】:

我尝试了两天没有成功,如果有人可以在这里帮助我...

我的获取/设置:

public class HTTPResult 

    private String id;
    private String nome;
    private String email;
    private String titulo;
    private String resumo;
    private String texto;
    private String fonte;
    private String link;

    public String getEmail() 
        return email;
    

    public void setEmail(String email) 
        email = email;
    

    public String getNome() 
        return nome;
    

    public void setNome(String nome) 
        nome = nome;
    

    public String getID() 
        return id;
    

    public void setID(String ID) 
        this.id = ID;
    

    public String getTitulo() 
        return titulo;
    

    public void setTitulo(String titulo) 
        this.titulo = titulo;
    

    public String getResumo() 
        return resumo;
    

    public void setResumo(String resumo) 
        this.resumo = resumo;
    

    public String getTexto() 
        return texto;
    

    public void setTexto(String texto) 
        this.texto = texto;
    

    public String getFonte() 
        return fonte;
    

    public void setFonte(String fonte) 
        this.fonte = fonte;
    

    public String getLink() 
        return link;
    

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

    @Override
    public String toString()
        return "Titulo: "+ getTitulo()
                     + "\nResumo: " + getResumo()
                     + "\nTexto: " + getTexto()
                     + "\nFonte: " + getFonte()
                     + "\nLink: " + getLink()
                     + "\nNome: " + getNome()
                     + "\nEmail: " + getEmail()
                     + "\nID: " + getID();

    

消费者 JSON WebServ,从 SQL 返回一个 JsonArray

"SELECT COUNT(*) FROM PERSONS":
public class HTTPService extends AsyncTask<Void, Void, HTTPResult> 

    private final String command;

    public HTTPService(String command) 
        this.command = command;
    


    @Override
    protected HTTPResult doInBackground(Void... voids) 
        StringBuilder resposta = new StringBuilder();

        try 
            URL url = new URL("http://10.0.2.2:8080/rest-FAKE/rest/fake" + command);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setRequestProperty("Accept", "application/json");
            connection.setConnectTimeout(5000);
            connection.connect();

            Scanner scanner = new Scanner(url.openStream());
            while (scanner.hasNext())
                resposta.append(scanner.next());
                System.out.println(resposta);
            
         catch (MalformedURLException e) 
            e.printStackTrace();
         catch (IOException e) 
            e.printStackTrace();
        

        return new Gson().fromJson(resposta.toString(), HTTPResult.class);
    

来自 Adaptador 类 (ListView) 的调用者:

@Override
public int getCount() 

    String command = "/qnts";
    HTTPService service = new HTTPService(command);

    int valor = 0;
    try 
        HTTPResult retorno = service.execute().get();
        valor = Integer.parseInt(contagem);

     catch (ExecutionException e) 
        e.printStackTrace();
     catch (InterruptedException e) 
        e.printStackTrace();
    

    return valor;

还有我亲爱的问题:

2020-06-07 22:21:13.456 2825-2888/com.example.fakenewsbrasil I/System.out: ["id":2]
2020-06-07 22:21:13.482 2825-2825/com.example.fakenewsbrasil W/System.err: java.util.concurrent.ExecutionException: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
2020-06-07 22:21:13.483 2825-2825/com.example.fakenewsbrasil W/System.err:     at java.util.concurrent.FutureTask.report(FutureTask.java:123)
2020-06-07 22:21:13.483 2825-2825/com.example.fakenewsbrasil W/System.err:     at java.util.concurrent.FutureTask.get(FutureTask.java:193)
2020-06-07 22:21:13.483 2825-2825/com.example.fakenewsbrasil W/System.err:     at android.os.AsyncTask.get(AsyncTask.java:542)
2020-06-07 22:21:13.483 2825-2825/com.example.fakenewsbrasil W/System.err:     at com.example.fakenewsbrasil.Adaptador.getCount(Adaptador.java:39)
2020-06-07 22:21:13.483 2825-2825/com.example.fakenewsbrasil W/System.err:     at android.widget.ListView.setAdapter(ListView.java:575)
2020-06-07 22:21:13.483 2825-2825/com.example.fakenewsbrasil W/System.err:     at com.example.fakenewsbrasil.MainActivity.onCreate(MainActivity.java:57)
2020-06-07 22:21:13.483 2825-2825/com.example.fakenewsbrasil W/System.err:     at android.app.Activity.performCreate(Activity.java:7136)
2020-06-07 22:21:13.483 2825-2825/com.example.fakenewsbrasil W/System.err:     at android.app.Activity.performCreate(Activity.java:7127)
2020-06-07 22:21:13.483 2825-2825/com.example.fakenewsbrasil W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
2020-06-07 22:21:13.483 2825-2825/com.example.fakenewsbrasil W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
2020-06-07 22:21:13.483 2825-2825/com.example.fakenewsbrasil W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
2020-06-07 22:21:13.484 2825-2825/com.example.fakenewsbrasil W/System.err:     at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
2020-06-07 22:21:13.484 2825-2825/com.example.fakenewsbrasil W/System.err:     at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
2020-06-07 22:21:13.484 2825-2825/com.example.fakenewsbrasil W/System.err:     at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
2020-06-07 22:21:13.484 2825-2825/com.example.fakenewsbrasil W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
2020-06-07 22:21:13.484 2825-2825/com.example.fakenewsbrasil W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:106)
2020-06-07 22:21:13.484 2825-2825/com.example.fakenewsbrasil W/System.err:     at android.os.Looper.loop(Looper.java:193)
2020-06-07 22:21:13.484 2825-2825/com.example.fakenewsbrasil W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6669)
2020-06-07 22:21:13.484 2825-2825/com.example.fakenewsbrasil W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
2020-06-07 22:21:13.484 2825-2825/com.example.fakenewsbrasil W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
2020-06-07 22:21:13.484 2825-2825/com.example.fakenewsbrasil W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2020-06-07 22:21:13.484 2825-2825/com.example.fakenewsbrasil W/System.err: Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
2020-06-07 22:21:13.484 2825-2825/com.example.fakenewsbrasil W/System.err:     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
2020-06-07 22:21:13.485 2825-2825/com.example.fakenewsbrasil W/System.err:     at com.google.gson.Gson.fromJson(Gson.java:927)
2020-06-07 22:21:13.485 2825-2825/com.example.fakenewsbrasil W/System.err:     at com.google.gson.Gson.fromJson(Gson.java:892)
2020-06-07 22:21:13.485 2825-2825/com.example.fakenewsbrasil W/System.err:     at com.google.gson.Gson.fromJson(Gson.java:841)
2020-06-07 22:21:13.485 2825-2825/com.example.fakenewsbrasil W/System.err:     at com.google.gson.Gson.fromJson(Gson.java:813)
2020-06-07 22:21:13.485 2825-2825/com.example.fakenewsbrasil W/System.err:     at com.example.fakenewsbrasil.HTTPService.doInBackground(HTTPService.java:45)
2020-06-07 22:21:13.485 2825-2825/com.example.fakenewsbrasil W/System.err:     at com.example.fakenewsbrasil.HTTPService.doInBackground(HTTPService.java:13)
2020-06-07 22:21:13.485 2825-2825/com.example.fakenewsbrasil W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:333)
2020-06-07 22:21:13.485 2825-2825/com.example.fakenewsbrasil W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
2020-06-07 22:21:13.485 2825-2825/com.example.fakenewsbrasil W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
2020-06-07 22:21:13.485 2825-2825/com.example.fakenewsbrasil W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
2020-06-07 22:21:13.485 2825-2825/com.example.fakenewsbrasil W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
2020-06-07 22:21:13.485 2825-2825/com.example.fakenewsbrasil W/System.err:     at java.lang.Thread.run(Thread.java:764)
2020-06-07 22:21:13.486 2825-2825/com.example.fakenewsbrasil W/System.err: Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
2020-06-07 22:21:13.486 2825-2825/com.example.fakenewsbrasil W/System.err:     at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
2020-06-07 22:21:13.486 2825-2825/com.example.fakenewsbrasil W/System.err:     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:215)
2020-06-07 22:21:13.486 2825-2825/com.example.fakenewsbrasil W/System.err:  ... 12 more
2020-06-07 22:21:13.489 2825-2888/com.example.fakenewsbrasil E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
    Process: com.example.fakenewsbrasil, PID: 2825
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:354)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
        at java.util.concurrent.FutureTask.run(FutureTask.java:271)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
        at com.google.gson.Gson.fromJson(Gson.java:927)
        at com.google.gson.Gson.fromJson(Gson.java:892)
        at com.google.gson.Gson.fromJson(Gson.java:841)
        at com.google.gson.Gson.fromJson(Gson.java:813)
        at com.example.fakenewsbrasil.HTTPService.doInBackground(HTTPService.java:45)
        at com.example.fakenewsbrasil.HTTPService.doInBackground(HTTPService.java:13)
        at android.os.AsyncTask$2.call(AsyncTask.java:333)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:764) 
     Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
        at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:215)
        at com.google.gson.Gson.fromJson(Gson.java:927) 
        at com.google.gson.Gson.fromJson(Gson.java:892) 
        at com.google.gson.Gson.fromJson(Gson.java:841) 
        at com.google.gson.Gson.fromJson(Gson.java:813) 
        at com.example.fakenewsbrasil.HTTPService.doInBackground(HTTPService.java:45) 
        at com.example.fakenewsbrasil.HTTPService.doInBackground(HTTPService.java:13) 
        at android.os.AsyncTask$2.call(AsyncTask.java:333) 
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:764) 
2020-06-07 22:21:13.507 2825-2888/com.example.fakenewsbrasil I/Process: Sending signal. PID: 2825 SIG: 9

求救

【问题讨论】:

【参考方案1】:

您的响应包含数组,这意味着您应该将其解析为 List。把AsyncTask改成这个

AsyncTask<Void, Void, ArrayList<HTTPResult>>
Type type = new TypeToken<ArrayList<HTTPResult>>() .getType();
return new Gson().fromJson(resposta.toString(), type);

【讨论】:

非常感谢,我遇到了一些错误,但我仍在尝试解决。不过我会来反馈的;【参考方案2】:

默认情况下,当您提供用于反序列化的类时,它将是一个对象。但是在您的场景中,您将获得一组对象,一切都很好,只是应该更新 AsyncTask 的返回类型。

你用过AsyncTask&lt;Void, Void, HTTPResult&gt;

public class HTTPService extends AsyncTask<Void, Void, HTTPResult> 

这意味着从 AsyncTask 你将返回一个类型为 HTTPResult 的对象,但是从后端你有一个对象数组,所以类型应该是 List&lt;HTTPResult&gt;

对您的HTTPService AsyncTask class进行以下更改

public class HTTPService extends AsyncTask<Void, Void, List<HTTPResult>> 
...
//rest of your code
Type listType = new TypeToken<List<HTTPResult>() .getType();
return new Gson().fromJson(resposta.toString(), listType)

【讨论】:

非常感谢,我遇到了一些错误,但我仍在尝试解决。不过我会来反馈的;

以上是关于AsyncTask 预期为 BEGIN_OBJECT,但在第 1 行第 2 列路径 $ 处为 BEGIN_ARRAY的主要内容,如果未能解决你的问题,请参考以下文章

从 Asynctask 更新 MainActivity 上的 ListView

使用 AsyncTask 显示进度时下载文件时出错

Android - 为 AsyncTask 设置超时?

将房间数据库的 AsyncTask 替换为 Rxjava

02Android--AsyncTask原理解析

为 AsyncTask 实现一个常规的 JSON 解析器函数