Android 改装从服务器获取空响应
我在使用改型解析json时遇到了麻烦。我调用了WebAPI,得到了200个状态码,但改型后给了我NullObject异常。如果有其他解决方案,我们将不胜感激。1) 改装1.9.0和2)改装2.0.2 我的jsonAndroid 改装从服务器获取空响应,android,json,rest,retrofit,Android,Json,Rest,Retrofit,我在使用改型解析json时遇到了麻烦。我调用了WebAPI,得到了200个状态码,但改型后给了我NullObject异常。如果有其他解决方案,我们将不胜感激。1) 改装1.9.0和2)改装2.0.2 我的json { "$id": "1", "objpo": { "$id": "2", "PODetail": [{ "$id": "3", "Purcha
{
"$id": "1",
"objpo": {
"$id": "2",
"PODetail": [{
"$id": "3",
"PurchaseOrderDetailId": 50003,
"PurchaseOrderId": 0
}],
"POAttachFiles": [{
"$id": "4",
"Attachmentid": 33277,
"AttachFile": "createpo.png"
}],
"StatusName": null,
"Country": "UK"
}
}
来自
改装版本2.0.2
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.android.support:design:23.3.0'
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
}
public interface POAPI {
//Testing
@FormUrlEncoded
@Headers("Accept:application/json")
@POST("PODetails")
Call<PODetailMaster> getPoDetailList(@Field("PurchaseOrderIdEyrypt") String poIdEncrypt);
}
public void PODeatilCallTest(final Context mContext, String PoEncrypId) {
final StringBuffer sb=new StringBuffer();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://host_url/api/PurchaseOrder/")
.addConverterFactory(GsonConverterFactory.create())
.build();
POAPI objPOAPI = retrofit.create(POAPI.class);
Call<PODetailMaster> objCall=objPOAPI.getPoDetailList(PoEncrypId);
objCall.enqueue(new Callback<PODetailMaster>() {
@Override
public void onResponse(Call<PODetailMaster> call, Response<PODetailMaster> response) {
Log.i("Code",""+response.code());
PODetailMaster objPoDetailMaster=response.body();
Objpo objPo=objPoDetailMaster.getObjpo();
String country=objPo.getCountry(); //<---getting null object
Log.i("PO",country);
for(PODetail objPoDetail:objPo.getPODetail()){
Log.i("ID:",""+objPoDetail.getPurchaseOrderDetailId());
}
}
@Override
public void onFailure(Call<PODetailMaster> call, Throwable t) {
}
});
}
依赖项{
编译文件树(包括:['*.jar'],目录:“libs”)
testCompile'junit:junit:4.12'
编译'com.android.support:appcompat-v7:23.3.0'
编译'com.android.support:design:23.3.0'
编译'com.google.code.gson:gson:2.6.2'
编译'com.squareup.Refught2:Refught2.0.2'
编译'com.squareup.Refught2:converter gson:2.0.2'
}
公共接口POAPI{
//测试
@FormUrlEncoded
@标题(“接受:应用程序/json”)
@邮政(“详细信息”)
调用getPoDetailList(@Field(“PurchaseOrderIdEyrypt”)字符串poIdEncrypt);
}
public void PODeatilCallTest(最终上下文mContext,字符串PoencryId){
最终StringBuffer sb=新StringBuffer();
改装改装=新改装.Builder()
.baseUrl(“http://host_url/api/PurchaseOrder/")
.addConverterFactory(GsonConverterFactory.create())
.build();
POAPI objPOAPI=reformation.create(POAPI.class);
调用objCall=objPOAPI.getPoDetailList(PoenType);
enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
Log.i(“Code”,“”+response.Code());
PODetailMaster objPoDetailMaster=response.body();
Objpo Objpo=objPoDetailMaster.getObjpo();
字符串country=objPo.getCountry();//objPo objPo=objpourchaseorder.getObjpo();?从中获取的“objpourchaseorder”值不是从resonce获取的值,或者其他任何东西尝试再次检查改型的哪个版本我正在使用改型1.9.0这是从API获取数据的当前方法吗?比如objPo objPo=objpourchaseorder.getObjpo();或者其他方式?我在Google Crome的Advance REST客户端上测试了这个web api调用,运行良好,获得了200条数据响应。我不这么认为,如果你是2.0版的新版本,那么uObjpo objPo=objPurchaseOrder.getObjpo();?“objPurchaseOrder”的值在哪里假设您没有从resonce或其他任何东西获得此值,请尝试再次检查改型r u使用的版本我正在使用改型1.9.0这是从API获取数据的当前方法吗?例如Objpo Objpo=objPurchaseOrder.getObjpo();或者其他方式?我在Google Crome的Advance REST客户端测试了这个web api调用,运行良好,用数据获取响应200。我不这么认为,如果你是retro中的新用户,尝试使用2.0版本,它对你来说更好、更容易理解
@FormUrlEncoded
@Headers("Accept:application/json")
@POST(ConstantValues.PO_DETAILS_ENDPOINT) // my web api's url
void PoDetailListService(
@Field("PurchaseOrderIdEyrypt") String poIdEncrypt,
Callback<PODetailMaster> response
);
public void PODeatilCall(final Context mContext, String PoEncrypId) {
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(ConstantValues.HOST_NAME)
.setLogLevel(RestAdapter.LogLevel.FULL)
.build();
POAPI objPOAPI = restAdapter.create(POAPI.class);
final StringBuffer sb=new StringBuffer();
objPOAPI.PoDetailListService(PoEncrypId, new Callback<PODetailMaster>() {
@Override
public void success(PODetailMaster objPurchaseOrder, Response
response) {
Log.i("StatusCode",""+response.getStatus());
Objpo objPo=objPurchaseOrder.getObjpo();
//-----------------objPo is null here-------------------//
String country=objPo.getCountry(); //<---getting null object
Log.i("PO",country);
for(PODetail objPoDetail:objPo.getPODetail()){
Log.i("ID:",""+objPoDetail.getPurchaseOrderDetailId());
}
}
@Override
public void failure(RetrofitError error) {
dialog.dismiss();
Toast.makeText(mContext, error.toString(),
Toast.LENGTH_SHORT).show();
sb.append("Network Error");
}
});
}
05-17 16:36:14.435 31529-31529/com.test E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.test, PID: 31529
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.test.Model.PoDetails2.Objpo.getCountry()' on a null object reference
at com.test.Utils.Common$2.success(Common.java:169)
at com.test.Utils.Common$2.success(Common.java:158)
at retrofit.CallbackRunnable$1.run(CallbackRunnable.java:45)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.android.support:design:23.3.0'
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
}
public interface POAPI {
//Testing
@FormUrlEncoded
@Headers("Accept:application/json")
@POST("PODetails")
Call<PODetailMaster> getPoDetailList(@Field("PurchaseOrderIdEyrypt") String poIdEncrypt);
}
public void PODeatilCallTest(final Context mContext, String PoEncrypId) {
final StringBuffer sb=new StringBuffer();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://host_url/api/PurchaseOrder/")
.addConverterFactory(GsonConverterFactory.create())
.build();
POAPI objPOAPI = retrofit.create(POAPI.class);
Call<PODetailMaster> objCall=objPOAPI.getPoDetailList(PoEncrypId);
objCall.enqueue(new Callback<PODetailMaster>() {
@Override
public void onResponse(Call<PODetailMaster> call, Response<PODetailMaster> response) {
Log.i("Code",""+response.code());
PODetailMaster objPoDetailMaster=response.body();
Objpo objPo=objPoDetailMaster.getObjpo();
String country=objPo.getCountry(); //<---getting null object
Log.i("PO",country);
for(PODetail objPoDetail:objPo.getPODetail()){
Log.i("ID:",""+objPoDetail.getPurchaseOrderDetailId());
}
}
@Override
public void onFailure(Call<PODetailMaster> call, Throwable t) {
}
});
}