如何从android(java)中的json响应中获取内部索引对象,android(java)对RESTAPI调用进行了改进
我面临从api响应的内部对象获取对象的问题。下面给出了我的api响应格式如何从android(java)中的json响应中获取内部索引对象,android(java)对RESTAPI调用进行了改进,java,android,api,retrofit,viewmodel,Java,Android,Api,Retrofit,Viewmodel,我面临从api响应的内部对象获取对象的问题。下面给出了我的api响应格式 { status: true, message: success, result: { name: demo, url: mysiet.com } } @POST("myendpoint") Flowable<Project> getProjectData( @Header("Authorizatio
{
status: true,
message: success,
result: {
name: demo,
url: mysiet.com
}
}
@POST("myendpoint")
Flowable<Project> getProjectData(
@Header("Authorization") String token,
@Header("Accept") String accept
);
我创建了两个模型类,如下所示
{
status: true,
message: success,
result: {
name: demo,
url: mysiet.com
}
}
@POST("myendpoint")
Flowable<Project> getProjectData(
@Header("Authorization") String token,
@Header("Accept") String accept
);
Project.java
ProjectData.java
在我的viewmodel中,我向服务器发送了api请求,如下所示
final LiveData<Resource<Project>> source = LiveDataReactiveStreams.fromPublisher(
dashboardApi.getProjectData(
"Bearer "+this.authCode,
"applicaion/json"
)
.onErrorReturn(new Function<Throwable, Project>() {
@Override
public Project apply(Throwable throwable) throws Exception {
Project projects = new Project();
projects.setStatus(false);
Log.d( TAG , "projectResource error ");
return projects;
}
})
.map(new Function<Project, Resource<Project>>() {
@Override
public Resource<Project> apply(Project project) throws Exception {
Log.d( TAG , "projectResource full Status "+project.getStatus()); // This retruns correctly
Log.d( TAG , "projectResource full Obj "+project.getResult()); // This is not null hence object works
Log.d( TAG , "projectResource full Obj "+project.getResult().getName()); // This cause error
//The above line cause error
if(project.getStatus() == false){
return Resource.error("projectResource Could not authenticate", null);
}
return Resource.success(project);
}
}).subscribeOn(Schedulers.io())
);
@SerializedName("result")
@Expose
private Object result;
final LiveData source=LiveDataReactiveStreams.fromPublisher(
dashboardApi.getProjectData(
“承载人”+此.authCode,
“应用程序/json”
)
.onErrorReturn(新函数(){
@凌驾
公共项目应用(Throwable Throwable)引发异常{
项目=新项目();
项目。setStatus(假);
Log.d(标记“projectResource错误”);
返回项目;
}
})
.map(新函数(){
@凌驾
公共资源应用(项目)引发异常{
Log.d(标记“projectResource full Status”+project.getStatus());//此命令正确运行
Log.d(标记“projectResource full Obj”+project.getResult());//这不是null,因此对象可以工作
Log.d(标记“projectResource full Obj”+project.getResult().getName());//这会导致错误
//上面的行会导致错误
if(project.getStatus()==false){
返回Resource.error(“projectResource无法验证”,null);
}
返回资源。成功(项目);
}
}).subscribeOn(Schedulers.io())
);
请求按如下所示发送
{
status: true,
message: success,
result: {
name: demo,
url: mysiet.com
}
}
@POST("myendpoint")
Flowable<Project> getProjectData(
@Header("Authorization") String token,
@Header("Accept") String accept
);
@POST(“myendpoint”)
可流动的getProjectData(
@标题(“授权”)字符串标记,
@标题(“接受”)字符串接受
);
下面给出了我得到的错误
{
status: true,
message: success,
result: {
name: demo,
url: mysiet.com
}
}
@POST("myendpoint")
Flowable<Project> getProjectData(
@Header("Authorization") String token,
@Header("Accept") String accept
);
无法将异常传递给使用者,因为它已取消/处置流,或者异常无处可去。进一步阅读:| java.lang.AbstractMethodError:抽象方法“java.lang.String com.myapppackage.f.c.a()”
我发布了一个用于获取内部索引json对象值的答案。我也期待着任何其他的解决方案作为答案 在模型中,我创建的结果为
对象
数据类型如下
final LiveData<Resource<Project>> source = LiveDataReactiveStreams.fromPublisher(
dashboardApi.getProjectData(
"Bearer "+this.authCode,
"applicaion/json"
)
.onErrorReturn(new Function<Throwable, Project>() {
@Override
public Project apply(Throwable throwable) throws Exception {
Project projects = new Project();
projects.setStatus(false);
Log.d( TAG , "projectResource error ");
return projects;
}
})
.map(new Function<Project, Resource<Project>>() {
@Override
public Resource<Project> apply(Project project) throws Exception {
Log.d( TAG , "projectResource full Status "+project.getStatus()); // This retruns correctly
Log.d( TAG , "projectResource full Obj "+project.getResult()); // This is not null hence object works
Log.d( TAG , "projectResource full Obj "+project.getResult().getName()); // This cause error
//The above line cause error
if(project.getStatus() == false){
return Resource.error("projectResource Could not authenticate", null);
}
return Resource.success(project);
}
}).subscribeOn(Schedulers.io())
);
@SerializedName("result")
@Expose
private Object result;
在视图模型映射函数中,我执行了以下操作以获取内部json对象
map(new Function<Project, Resource<Project>>() {
@Override
public Resource<Project> apply(Project project) throws Exception {
Gson gson = new Gson();
String projectData = gson.toJson(project.getResult());
// The above code return result index as string {"name": "demo", "url": "mysiet.com"}
try{
JSONObject projectObj = new JSONObject( projectData );// get inner json index as object
project.setName(projectObj.getString("name"));
project.setUrl(projectObj.getString("url"));
} catch (JSONException e) {
Log.d( TAG , "JSONException : "+e.getMessage());
}
if(project.getStatus() == false){
return Resource.error(project.getMessage(), null);
}
return Resource.success(project);
}
})
map(新函数(){
@凌驾
公共资源应用(项目)引发异常{
Gson Gson=新的Gson();
字符串projectData=gson.toJson(project.getResult());
//上面的代码以字符串{“name”:“demo”,“url”:“mysiet.com”}的形式返回结果索引
试一试{
JSONObject projectObj=新建JSONObject(projectData);//获取内部json索引作为对象
project.setName(projectObj.getString(“名称”));
setUrl(projectObj.getString(“url”);
}捕获(JSONException e){
d(标记“JSONException:+e.getMessage());
}
if(project.getStatus()==false){
返回Resource.error(project.getMessage(),null);
}
返回资源。成功(项目);
}
})
我想也会有其他解决方案,请随时发布答案@Gunaseelan抱歉,这是一个输入错误,实际上它是JSON响应中的
结果
。我现在已经编辑了这个问题请提供更多错误视图…@AliVatanparast我收到的错误是由以下原因引起的::java.lang.AbstractMethodError:AbstractMethod“java.lang.String com.myapppackage.f.c.a()
嘿,你能在这里提供帮助吗-->