【问题标题】:Error cannot resolve method while getting array of object with retrofit使用改造获取对象数组时出现错误无法解析方法
【发布时间】:2019-09-03 05:45:11
【问题描述】:

我想获取对象数组 (JSON),然后获取一些值。

我已经尝试过像这里这样的一切: How to get array of objects with gson/retrofit?

但我遇到了来自 Android Studio 的提示错误,例如 Cannot resolve method 'getId()'

JSON:

[{
    "id": "551454",
    "rights": ["auth", "objects-prepaid-get"],
    "services": [{
        "service_id": "103",
        "options": {
            "sum": 0
        },
        "dismisable": 0
    }],
    "date_activate": "2017-11-11",
    "period": {
        "date_action": "2019-03-29",
        "after": 0
    },
    "ast": {
        "id": "3",
        "services": [{
            "service_id": "4",
            "dismisable": 0
        }, {
            "service_id": "5",
            "dismisable": 0
        }]
    },
    "ast_s": {
        "id": "82",
        "services": [{
            "service_id": "4",
            "dismisable": 0
        }, {
            "service_id": "5",
            "dismisable": 0
        }],
        "date": "2019-03-29",
        "dissmissable": 1
    }
}]

我在 Activity 中做什么:

onCreate(){
...
Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        SomeAPI userClient2  = retrofit.create(SomeAPI.class);
        getUserInfo();

}

private void getUserInfo() {
        token = AppPreferences.getStringFromSh(getApplicationContext());
        Call<List<User>> call2 = userClient2.getInfoUser("Bearer " + token);

        call2.enqueue(new Callback<List<User>>() {
            @Override
            public void onResponse(Call<List<User>> call, Response<List<User>> response) {
                if (response.code() == 200){
                        id = response.body().getId(); //id - List<Integer>
                        tvAccount.append(" " + id);

                }
                else {
                    Toast.makeText(UserProfile.this, "Err while loading", Toast.LENGTH_SHORT).show();

                }
            }

            @Override
            public void onFailure(Call<List<User>> call, Throwable t) {
                Toast.makeText(UserProfile.this, "error!", Toast.LENGTH_SHORT).show();
            }
        });
    }

在界面中我有:

@GET("objects")
    Call<List<User>> getInfoUser(@Header("Authorization") String token);

在 User.class 我有:

public class User {
    private List<Integer> id;
 public List<Integer> getId(){
        return id;
    }

    public void setId(List<Integer> id){
        this.id = id;
    }
}

我的代码有什么问题?我哪里做错了?

更新:

试过了:

            id = response.body().get(0).getId();
            tvAccount.append(" " + id);

获取:

Expected BEGIN_ARRAY but was StRING at line 1 column 9 path $[0].id

【问题讨论】:

  • 请注意更新后的 JSON 和 UPD 下面的信息

标签: android json list retrofit


【解决方案1】:

似乎response.body() 返回了List&lt;User&gt;,因此您必须访问列表中的一项。示例:

response.body().get(0).getId();

【讨论】:

  • 当我这样做时:id = response.body().get(0).getId(); tvAccount.append(" " + id); 我得到 onFailure() 方法。但是我的 API 以我在问题中描述的格式返回 JSON。
  • 在 OnFailure 回调中显示 Throwable 的值,并添加您的 json 样本...例如...json数组上的两个对象...您确定您的 json 不是格式不正确?
  • JSON 又大又硬,但我只需要那些第一个 id 值。
  • 哦,您在示例中询问了两个对象.. [JSON],[Same JSON structure but another values]。
  • 你的模型类错了,id是一个简单的String而不是列表,用这个来生成模型类jsonschema2pojo.org
【解决方案2】:

你不能直接从列表中获取 getId()

List<User> listUser=response.body();

如果您希望有多个用户,则应查看整个用户列表以获取 Id

for (User user : listUser) 
{ 
    List<Integer> listIds=user.getId();
}

你的对象必须是

public class User {
    private String id;

    public String getId(){
        return id;
    }

    public void setId(String id){
        this.id = id;
    }
}

【讨论】:

  • 我不确定我是否了解我需要在我的onResponse() 中做什么以及我应该如何从 JSON 响应中获取 ID
猜你喜欢
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 2020-05-21
  • 1970-01-01
相关资源
最近更新 更多