2017-09-13 4 views
0

Je sais que ce n'est pas la première fois que quelqu'un pose une question sur ce problème, mais avec Retrofit2 je ne trouve pas la bonne solution à mon problème. J'ai suivi un tutoriel en ligne et cela a très bien fonctionné. Lorsque j'ai appliqué le même code à mon propre point de terminaison, j'ai reçu cette exception: java.lang.IllegalStateException: BEGIN_ARRAY attendue mais BEGIN_OBJECT à la ligne 1 colonne 2 chemin $ Je ne sais pas comment résoudre ce problème. J'ai données JSON comme celui-ciImpossible d'obtenir des données JSON avec retrofit 2

[ { "id_toko": "3", "nama_toko": "Toko Ajib", "pesan_toko": "Diskon Gan !!" }]

et comme celui-ci

[ { "id_device": "1", "nama_device": "Samsung Galaxy A5", "jenis_device": "Android" }]

Je veux les analyser à mon application, ceci est mon API de service

public interface ServiceApi { 

    @GET("show2.php") 
     Call<List<DataRepo>> toko(

    ); 

    @GET("show1.php") 
     Call<DataSearch> searching(

    ); 
} 

Et voici mon modèle:

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; 
    } 
} 

Ma principale méthode

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

mais je ne peux pas obtenir les données JSON, tout ce que j'ai en journal des erreurs est

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 

Répondre

0

Utilisez cette classe de modèle pour votre première 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; 
} 

} 

et la méthode suivante pour votre appel réseau à l'aide de mise à niveau 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"); 
     } 


    }); 

} 

et les éléments suivants pour spécifier les extrémités

public interface BankInterface { 

@GET("your endpoint") 
Call<List<JsonItems>> getToken(); 
} 

Espérons que cela aide!

+0

merci, une question de plus, existe-t-il une méthode pour stocker mes données json en variable et l'utiliser dans une autre fonction? – aruhama

+0

oui vous pouvez, enregistrez-le à partager pref comme ceci >> Gson gson = new Gson(); Chaîne json = gson.toJson (jsonItems); –

+0

stockez ces données pour les préférences partagées et les utiliser dans la fonction que vous voulez –