繁体   English   中英

如何从android(java)中的json响应中获取内部索引对象,该对象对rest api调用使用改造

[英]How to get inner indexed object from json response in android (java) which use retrofit for rest api calls

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

{
    status: true,
    message: success,
    result: {
        name: demo,
        url: mysiet.com
    }
}

我创建了两个模型类,如下所示

项目.java

public class Project {

    @SerializedName("result")
    @Expose
    private ProjectData result;

    @SerializedName("message")
    @Expose
    private String message;

    @SerializedName("status")
    @Expose
    private boolean status;

    //constructor, setter and getter functions I am skipping 

}

项目数据.java

public class ProjectData { 

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

    @SerializedName("url")
    @Expose
    private String url;

    //constructor, setter and getter functions I am skipping 

}

在我的视图模型中,我已将 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())
);

请求发送如下

@POST("myendpoint")
Flowable<Project> getProjectData(
        @Header("Authorization") String token,
        @Header("Accept") String accept
);

我得到的错误如下

异常无法传递给消费者,因为它已经取消/处置了流,或者异常无处可去。 进一步阅读: https : //github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling | java.lang.AbstractMethodError:抽象方法“java.lang.String com.myapppackage.fca()”

我发布了一个我用来获取内部索引 json 对象值的答案。 我也期待任何其他解决方案作为答案

在模型中,我将结果创建为Object数据类型,如下所示

@SerializedName("result")
@Expose
private Object result;

在视图模型 Map 函数中,我执行以下操作以获取内部 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);
    }
})

我想也会有其他解决方案,请随时发布答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM