Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从android(java)中的json响应中获取内部索引对象,android(java)对RESTAPI调用进行了改进_Java_Android_Api_Retrofit_Viewmodel - Fatal编程技术网

如何从android(java)中的json响应中获取内部索引对象,android(java)对RESTAPI调用进行了改进

如何从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

我面临从api响应的内部对象获取对象的问题。下面给出了我的api响应格式

{
    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()
嘿,你能在这里提供帮助吗-->