Retrofit2 Android:预计BEGIN_ARRAY但在第1行第2列路径为BEGIN_OBJECT路径$ [英] Retrofit2 Android: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

查看:186
本文介绍了Retrofit2 Android:预计BEGIN_ARRAY但在第1行第2列路径为BEGIN_OBJECT路径$的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道这不是第一次有人问起这个问题,但是使用Retrofit2我无法找到解决问题的正确方法。我按照在线教程,它工作得很好。当我将相同的代码应用到我自己的端点时,我得到了这个异常: java.lang.IllegalStateException:预期BEGIN_ARRAY但是第1行第2行的BEGIN_OBJECT路径$ 我不知道如何解决这个问题。

I know this is not the first time someone asking about this problem but with Retrofit2 I can't find the right solution to my problem. I followed a online tutorial and it worked just fine. When I applied same code to my own endpoint i get this exception: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $ I don't know how to solve this.

接口:

public interface MyApiService {

// Is this right place to add these headers?
@Headers({"application-id: MY-APPLICATION-ID",
        "secret-key: MY-SECRET-KEY",
        "application-type: REST"})
@GET("Music")
Call<List<Music>> getMusicList();



Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(MySettings.REST_END_POINT)
        .addConverterFactory(GsonConverterFactory.create())
        .build();
}

客户代码:

MyApiService service = MyApiService.retrofit.create(MyApiService.class);
Call<List<Music>> call = service.getMusicList();
call.enqueue(new Callback<List<Music>>() {

    @Override
    public void onResponse(Call<List<Music>> call, Response<List<Music>> response) {
        Log.e("MainActivity", response.body().
    }

    @Override
    public void onFailure(Call<List<Music>> call, Throwable t) {
        Log.e("MainActivity", t.toString());
    }
});

此代码使用此有效负载:

This code working with this payload:

[
{
    "login": "JakeWharton",
    "id": 66577,
    "avatar_url": "https://avatars.githubusercontent.com/u/66577?v=3",
    "gravatar_id": "",
    "url": "https://api.github.com/users/JakeWharton",
    "html_url": "https://github.com/JakeWharton",
    "followers_url": "https://api.github.com/users/JakeWharton/followers",
    "following_url": "https://api.github.com/users/JakeWharton/following{/other_user}",
    "gists_url": "https://api.github.com/users/JakeWharton/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/JakeWharton/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/JakeWharton/subscriptions",
    "organizations_url": "https://api.github.com/users/JakeWharton/orgs",
    "repos_url": "https://api.github.com/users/JakeWharton/repos",
    "events_url": "https://api.github.com/users/JakeWharton/events{/privacy}",
    "received_events_url": "https://api.github.com/users/JakeWharton/received_events",
    "type": "User",
    "site_admin": false,
    "contributions": 741
},
{....

但不是这一个:

{
"offset": 0,
"data": [
    {
        "filename": "E743_1458662837071.mp3",
        "created": 1458662854000,
        "publicUrl": "https://api.backendless.com/dbb77803-1ab8-b994-ffd8-65470fa62b00/v1/files/music/E743_1458662837071.mp3",
        "___class": "Music",
        "description": "",
        "likeCount": 0,
        "title": "hej Susanne. ",
        "ownerId": "E743756F-E114-6892-FFE9-BCC8C072E800",
        "updated": null,
        "objectId": "DDD8CB3D-ED66-0D6F-FFA5-B14543ABC800",
        "__meta": "{\"relationRemovalIds\":{},\"selectedProperties\":[\"filename\",\"created\",\"publicUrl\",\"___class\",\"description\",\"likeCount\",\"title\",\"ownerId\",\"updated\",\"objectId\"],\"relatedObjects\":{}}"
    },
    {...

我的音乐课程:

public class Music {

   private String ownerId;
   private String filename;
   private String title;
   private String description;
   private String publicUrl;
   private int likeCount;

   // Getters & Setters

}


推荐答案

当您说此代码正在工作时g使用这个有效负载:...但不是这个:...这是预期的,这是它的工作方式。事实上,错误消息告诉你,在将json转换为java对象时,调用期望一个数组而json却得到了一个对象。

When you say "This code is working with this payload:... but not with this one:..." that's expected and that's how it's suppose to work. In fact the error message tells you that while converting the json to a java object the call expected an array in the json but got an object instead.

这个电话:

@GET("Music")
Call<List<Music>> getMusicList();

需要一个音乐对象的列表,这是为什么它适用于json:

expects a list of Music objects, that's why it works with the json:

[
  {
    "login": "JakeWharton",
    ...
  },
  ...
]

因为json本身是 Music 对象的数组(Retrofit可以在json数组之间转换为java列表)。对于第二个json,你只有一个对象而不是一个数组(注意缺少 [...] )。为此,您需要使用另一个映射到该json的模型创建另一个调用。假设您已将模型命名为 MusicList 。以下是呼叫的外观:

Because the json itself is an array of your Music objects (Retrofit can convert between json arrays to java lists). For the second json you have just an object and not an array (notice the lack of [...]). For this you need to create another call with another model that maps to that json. Let's assume you've named the model MusicList. Here's how the call could look like:

@GET("Music")
Call<MusicList> getMusicList();

(请注意,如果您想同时保留第一个电话,则可能需要更改方法名称这个)。

(Note that you might need to change the method name if you want to keep both the first call and this one).

MusicList 模型看起来像这样:

public class MusicList {
  @SerializedName("data")
  private List<Music> musics;
  // ...
}

我假设 data array是 Music 对象的列表,但我确实注意到jsons完全不同。您可能也需要对此进行调整,但我认为您可以在此处了解相关信息。

I'm assuming that the data array is a list of Music objects, but I did notice that the jsons are completely different. You might need to adapt this as well, but I think you get the picture here.

这篇关于Retrofit2 Android:预计BEGIN_ARRAY但在第1行第2列路径为BEGIN_OBJECT路径$的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆