无法通过改造2获得JSON数据

时间:2017-09-13 03:20:01

标签: java retrofit2

我知道这不是第一次有人问起这个问题但是使用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

1 个答案:

答案 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();
}

希望这有帮助!