我知道这不是第一次有人问起这个问题但是使用Retrofit2我无法找到解决问题的正确方法。我按照在线教程进行操作,效果很好。当我将相同的代码应用到我自己的端点时,我得到了这个异常:java.lang.IllegalStateException:预期BEGIN_ARRAY但是第1行第2行的BEGIN_OBJECT路径$我不知道如何解决这个问题。 我有像这样的JSON数据
[ { " id_toko":" 3", " nama_toko":" Toko Ajib", " pesan_toko":" Diskon Gan !!" }]
并且喜欢这个
[ { " id_device":" 1", " nama_device":"三星Galaxy A5", " jenis_device":" Android" }]
我想将它们解析为我的应用,这是我的服务API
public interface ServiceApi {
@GET("show2.php")
Call<List<DataRepo>> toko(
);
@GET("show1.php")
Call<DataSearch> searching(
);
}
这是我的模特:
public class DataRepo {
@SerializedName("id_toko")
int id_toko;
@SerializedName("nama_toko")
String nama_toko;
@SerializedName("pesan_toko")
String pesan_toko;
public int getId_toko() {
return id_toko;
}
public String getNama_toko() {
return nama_toko;
}
public String getPesan_toko() {
return pesan_toko;
}
}
public class DataSearch {
@SerializedName("items")
List<Item> items;
public List<Item> getItems() {
return items;
}
}
public class Item {
@SerializedName("id_device")
int id_device;
@SerializedName("nama_device")
String nama_device;
@SerializedName("jenis_device")
String jenis_device;
public int getId_device() {
return id_device;
}
public String getNama_device() {
return nama_device;
}
public String getJenis_device() {
return jenis_device;
}
}
我的主要方法
public class Main {
public static void main(String[] args) {
ServiceApi client = ClientApi.createService(ServiceApi.class);
Call<List<DataRepo>> call = client.toko();
Call<DataSearch> call1 = client.searching();
List<DataRepo> toko = null;
DataSearch searches = null;
List<Item> items = null;
try {
toko = call.execute().body();
searches = call1.execute().body();
for (DataRepo tokos : toko) {
System.out.println(tokos.getNama_toko() + " (" + tokos.getPesan_toko() + ")");
}
System.out.println();
items = searches.getItems();
for (Item item : items){
System.out.println(item.getNama_device() + ", Jenis: " + item.getJenis_device());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
BUt我无法获取JSON数据,我在错误日志中的所有内容都是
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2
答案 0 :(得分:0)
将此模型类用于第一个json
public class JsonItems{
@SerializedName("id_toko")
@Expose
private String idToko;
@SerializedName("nama_toko")
@Expose
private String namaToko;
@SerializedName("pesan_toko")
@Expose
private String pesanToko;
public String getIdToko() {
return idToko;
}
public void setIdToko(String idToko) {
this.idToko = idToko;
}
public String getNamaToko() {
return namaToko;
}
public void setNamaToko(String namaToko) {
this.namaToko = namaToko;
}
public String getPesanToko() {
return pesanToko;
}
public void setPesanToko(String pesanToko) {
this.pesanToko = pesanToko;
}
}
以及使用改造2进行网络呼叫的以下方法
private void loadJSON() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("your BASE_URL")
.addConverterFactory(GsonConverterFactory.create())
.build();
BankInterface request = retrofit.create(RequestInterface.class);
Call<List<JsonItems>> call = request.getToken();
call.enqueue(new Callback<List<JsonItems>>() {
@Override
public void onResponse(Call<List<JsonItems>> call, Response<List<JsonItems>> response) {
List<JsonItems> jsonItems= response.body();
String token = jsonItems.get(0).getIdToko();
}
@Override
public void onFailure(Call<List<JsonItems>> call, Throwable t) {
showToast("No Internet Connection");
}
});
}
以及以下用于指定端点
public interface BankInterface {
@GET("your endpoint")
Call<List<JsonItems>> getToken();
}
希望这有帮助!