android - retrofit 2 - 无法读取json数组并解析它

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android - retrofit 2 - 无法读取json数组并解析它相关的知识,希望对你有一定的参考价值。

我有这个json,它返回一些数据并将它放在一个json数组对象中:

{
"id": "58",
"p": "4297f44b13955235245b2497399d7a",
"name": "0634063306cc06340634063306cc",
"contacts": [{
    "id": "1",
    "name": "test1"
}, {
    "id": "2",
    "name": "test2"
}]
}

我想准备好阵列,这些是我的代码:

联系班级代码:

public class Contact {
@SerializedName("id")
@Expose
private String id;
@SerializedName("name")
@Expose
private String name;

public String getId() {
    return id;
}

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

public Contact withId(String id) {
    this.id = id;
    return this;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Contact withName(String name) {
    this.name = name;
    return this;
}
   }

这是联系人类代码:

    public class Contacts {
    @SerializedName("id")
@Expose
private String id;
@SerializedName("p")
@Expose
private String p;
@SerializedName("name")
@Expose
private String name;
@SerializedName("contacts")
@Expose
private List<Contact> contacts = null;

public String getId() {
return id;
}

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

public Contacts withId(String id) {
this.id = id;
return this;
}

public String getP() {
return p;
}

public void setP(String p) {
this.p = p;
}

public Contacts withP(String p) {
this.p = p;
return this;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Contacts withName(String name) {
this.name = name;
return this;
}

public List<Contact> getContacts() {
return contacts;
}

public void setContacts(List<Contact> contacts) {
this.contacts = contacts;
}

public Contacts withContacts(List<Contact> contacts) {
this.contacts = contacts;
return this;
}
    }

我已经编写了这个用于解析数据的接口:

public interface UserLogin {
@GET("/getLogin3.php")
Call<Contacts>getItems();
}

这些是我的活动类中的代码:

Call<Contacts>rows=connection.getItems();
    rows.enqueue(new Callback<Contacts>() {
        @Override
        public void onResponse(Call<Contacts> call, Response<Contacts> response) {
                Log.v("this", "id" + response.body().getId());
                Log.v("this", "name" + response.body().getName());

            Contacts simpleItem = response.body();
            List<Contact>contacts=simpleItem.getContacts();
            for (int i=0; i<contacts.size();i++){
                Log.v("this","result "+ contacts.get(i).getId()+ " - "
                + contacts.get(i).getName());
            }
        }

        @Override
        public void onFailure(Call<Contacts> call, Throwable t) {
            Log.v("this",t.getMessage());
        }
    });

它进入故障方法,错误是:

Expected name at line 2 column 1 path $.

这段代码有什么问题?我找不到它

答案

试试这个

Call<Contacts>rows=connection.getItems();
rows.enqueue(new Callback<Contacts>() {
    @Override
    public void onResponse(Call<Contacts> call, Response<Contacts> response) {
           if (response.isSuccessful())
           if (response.body() != null)

        // Contacts simpleItem = response.body();
        List<Contact>contacts=response.body().getContacts() 
        for (int i=0; i<contacts.size();i++){
            Log.v("this","result "+ contacts.get(i).getId()+ " - "
            + contacts.get(i).getName());
        }
    }

    @Override
    public void onFailure(Call<Contacts> call, Throwable t) {
        Log.v("this",t.getMessage());
    }
});
另一答案

我认为你得到的数据存在问题,你可以通过添加拦截器和改装来检查它:

builderOkHttpClient.Builder的对象,您可能在代码中使用过。

 builder.interceptors().add(new Interceptor() {
            @Override
            public okhttp3.Response intercept(Chain chain) throws IOException {
                Request request = chain.request();

                request = request.newBuilder()
                        .url(request.url())
                        .build();

                okhttp3.Response response = chain.proceed(request);
// Check the responce here 
Log.i("Response ",response+"");
                return response;
            }
        });

把这个回答问题。

以上是关于android - retrofit 2 - 无法读取json数组并解析它的主要内容,如果未能解决你的问题,请参考以下文章

Dagger 2 无法访问 Retrofit

无法使用 Kotlin Retrofit 将数据从 Android 插入到 Mysql [重复]

在 Android Studio 中使用 Retrofit 无法从 000webhost 获得响应

无法在Android Retrofit中为我的班级创建转换器

Android - 获取错误“无法使用Retrofit构建实例(尽管至少存在一个创建)”

Android - 改造 2 - 身份验证器结果