2015-12-17 3 views
6

Мне нужно проанализировать массив JSON из «Дооснащения». Мне нужно, чтобы получить следующий ключ:Получите массив JSON из retrofit Response

{ 
    "rc":0, 
    "message":"success", 
    "he":[ 
    { 
     "name":"\u05de\u05e4\u05e7\u05d7", 
     "type":0 
    } 
    ] 
} 

Я могу легко получить сообщение, но я не в состоянии получить «он» массив из ответа.

Вот моя модель данных класса

public class GetRoleData implements Serializable { 

    @SerializedName("he") 

    private ArrayList<Roles> he; 

    @SerializedName("message") 
    private String message; 

    public GetRoleData() { 
     this.he = new ArrayList<>(); 
     this.message = ""; 
    } 

    public ArrayList<Roles> getUserRoles() { 
     return he; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public class Roles { 

     public Roles() { 
      name = ""; 
      type = -1; 
     } 

     @SerializedName("name") 

     private String name; 
     @SerializedName("type") 

     private int type; 

     public int getType() { 
      return type; 
     } 

     public String getName() { 
      return name; 
     } 

    } 
} 

Это, как я посылаю запрос на сервер:

@POST("index.php/") 
Call<GetRoleData> getUserRoles(@Body SetParams body); 

вот как я посылаю запрос и обработки ответа

APIService apiService = retrofit.create(APIService.class); 

     Call<GetRoleData > apiCall = apiService.getUserRoles(params); 
     apiCall.enqueue(new Callback<GetRoleData >() { 


      @Override 
      public void onResponse(retrofit.Response<GetRoleData > mUserProfileData, Retrofit retrofit) { 

       Log.e("locale info", "mUserProfileData = " + mUserProfileData.body().toString()); 
       if (pDialog != null) { 
        pDialog.dismiss(); 
       } 
       if (mUserProfileData.body().getMessage().equals("success")) { 

        Log.e("locale info", "user roles = " + mUserProfileData.body().getUserRoles().size()); 

       } else { 
        Toast.makeText(RegisterActivity.this, getResources().getString(R.string.get_role_error), Toast.LENGTH_SHORT).show(); 
       } 
      } 

      @Override 
      public void onFailure(Throwable t) { 

       if (pDialog != null) { 
        pDialog.dismiss(); 
       } 

       t.printStackTrace(); 
      } 
     }); 

Что я хочу

Мне нужно получить массив «he» от ответа выше. Пожалуйста, помогите Спасибо.

здесь ответ, который я получаю ..

enter image description here

+0

Пожалуйста, вставьте код, где вы делаете запрос и обработку ответа –

+0

@vipinagrahari пожалуйста, проверьте. –

+0

что «я не могу получить массив« он »от ответа« точно »? – Yazan

ответ

6

UPDATE ДЛЯ ЗАМЕНЫ 2.0-beta2:

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:appcompat-v7:23.1.1' 
    compile 'com.google.code.gson:gson:2.4' 
    compile 'com.squareup.okhttp:okhttp:2.5.0' 
    // compile 'com.squareup.retrofit:retrofit:1.9.0' 
    compile 'com.squareup.retrofit:retrofit:2.0.0-beta2' 
    compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2' 
} 

Интерфейс:

@GET("/api/values") 
Call<GetRoleData> getUserRoles(); 

MainActivity в OnCreate:

 // Retrofit 2.0-beta2 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(API_URL_BASE) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

     WebAPIService service = retrofit.create(WebAPIService.class); 

     // Asynchronous Call in Retrofit 2.0-beta2 
     Call<GetRoleData> call = service.getUserRoles(); 
     call.enqueue(new Callback<GetRoleData>() { 
      @Override 
      public void onResponse(Response<GetRoleData> response, Retrofit retrofit) { 
       ArrayList<GetRoleData.Roles> arrayList = response.body().getUserRoles(); 
       if (arrayList != null) { 
        Log.i(LOG_TAG, arrayList.get(0).getName()); 
       } 
      } 

      @Override 
      public void onFailure(Throwable t) { 
       Log.e(LOG_TAG, t.toString()); 
      } 
     }); 

дооснащения 1.9

Я использую ваш GetRoleData класс

Интерфейс:

public interface WebAPIService {   

    @GET("/api/values") 
    void getUserRoles(Callback<GetRoleData> callback);      
} 

MainActivity:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main);    

     // creating a RestAdapter using the custom client 
     RestAdapter restAdapter = new RestAdapter.Builder() 
       .setEndpoint(API_URL_BASE) 
       .setLogLevel(RestAdapter.LogLevel.FULL) 
       .setClient(new OkClient(mOkHttpClient)) 
       .build(); 

     WebAPIService webAPIService = restAdapter.create(WebAPIService.class); 

     Callback<GetRoleData> callback = new Callback<GetRoleData>() { 
      @Override 
      public void success(GetRoleData getRoleData, Response response) { 
       String bodyString = new String(((TypedByteArray) response.getBody()).getBytes()); 
       Log.i(LOG_TAG, bodyString); 
      } 

      @Override 
      public void failure(RetrofitError error) { 
       String errorString = error.toString(); 
       Log.e(LOG_TAG, errorString); 
      } 
     }; 

     webAPIService.getUserRoles(callback); 
    } 

скриншот как:

enter image description here

+0

Что такое RestAdapter, я не могу найти в модификации. –

+0

Я использую Retrofit 1.9, а не 2.0 beta, 'compile 'com.squareup.retrofit: retrofit: 1.9.0'' – BNK

+0

Ver 2.0, обратите внимание, что' RestAdapter' теперь также переименован в 'Retrofit'. http://stackoverflow.com/questions/32424184/restadapter-retrofit-not-resolving-in-android – BNK

2

Вы написали все добытчик кроме he правильно. Чтобы Retrofit проанализировал ваш JSON-файл, вы должны написать свой getter для переменной he следующим образом.

public ArrayList<Roles> getHe() { 
    return he; 
} 

Кроме того, попробуйте удалить новый ArrayList из конструктора.

public GetRoleData() { 
    // this.he = new ArrayList<>(); // <-- Remove here 
    this.message = ""; 
} 
+0

Вы можете написать это, пожалуйста? –

+0

Я написал это в своем ответе. Вы написали все ваши геттеры в правильном формате, кроме переменной. Вам нужно написать его как getHe (вместо getUserRoles), чтобы Retrofit проанализировал формат JSON. – berkayk

+0

в порядке позвольте мне попробовать. –

1

// Используйте следующие Pojo классы

public class GetRoleData { 

@SerializedName("rc") 
@Expose 
private Integer rc; 
@SerializedName("message") 
@Expose 
private String message; 
@SerializedName("he") 
@Expose 
private List<He> he = new ArrayList<He>(); 

/** 
* 
* @return 
* The rc 
*/ 
public Integer getRc() { 
return rc; 
} 

/** 
* 
* @param rc 
* The rc 
*/ 
public void setRc(Integer rc) { 
this.rc = rc; 
} 

/** 
* 
* @return 
* The message 
*/ 
public String getMessage() { 
return message; 
} 

/** 
* 
* @param message 
* The message 
*/ 
public void setMessage(String message) { 
this.message = message; 
} 

/** 
* 
* @return 
* The he 
*/ 
public List<He> getHe() { 
return he; 
} 

/** 
* 
* @param he 
* The he 
*/ 
public void setHe(List<He> he) { 
this.he = he; 
} 

} 
-----------------------------------com.example.He.java----------------------------------- 

package com.example; 

import javax.annotation.Generated; 
import com.google.gson.annotations.Expose; 
import com.google.gson.annotations.SerializedName; 


public class He { 

@SerializedName("name") 
@Expose 
private String name; 
@SerializedName("type") 
@Expose 
private Integer type; 

/** 
* 
* @return 
* The name 
*/ 
public String getName() { 
return name; 
} 

/** 
* 
* @param name 
* The name 
*/ 
public void setName(String name) { 
this.name = name; 
} 

/** 
* 
* @return 
* The type 
*/ 
public Integer getType() { 
return type; 
} 

/** 
* 
* @param type 
* The type 
*/ 
public void setType(Integer type) { 
this.type = type; 
} 

} 
+0

Нет успеха ... он такой же, как мой мой код .. какая разница в вашем коде –

+0

Какой ответ вы получаете Журналы –

+0

Я получаю сообщение как успех, но нет данных для него –

3

Mocky для тестов ->http://www.mocky.io/v2/567275072500008d0e995b2c Я использую Retrofit 2 (beta-2). Это не работает для меня, ничего особенного о нем: определение

Вызов:

@GET("/v2/567275072500008d0e995b2c") 
Call<Base> getMock(); 

Модели:

public class Base { 
    public int rc; 
    public String message; 
    public List<Role> he; 
} 

public class Role { 
    public String name; 
    public int type; 
} 

дооснащения:

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

Вызов выполнить:

webservice.getMock().enqueue(new Callback<Base>() { 
    @Override 
    public void onResponse(Response<Base> response, Retrofit retrofit) { 

    } 

    @Override 
    public void onFailure(Throwable t) { 

    } 
}); 
+0

это не сработало для меня .. хотя это код, как я делаю –

+0

Проверьте свой код на моей смешной ссылке, изменить модели на мою версию и т. д. Там где-то должна быть небольшая ошибка. – rafakob

+0

hmmm хорошо сделаю. –

0

Еще один простой способ получения данных с помощью веб-сервисы является использование JsonElement, а затем преобразовать его в JSONObject и разобрать JSONObject. Ez-Pz.

Примечание: JSONObject не такой же, как JSONObject, JSONObject принадлежит библиотеке GSON в

Смежные вопросы