如何从 android (java) 中的 json 响应中获取内部索引对象,它使用 retrofit 进行剩余 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
    }
}

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

Project.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 

}

ProjectData.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
);

我得到的错误如下

The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the exception has nowhere to go to begin with. Further reading: https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling | java.lang.AbstractMethodError: abstract method "java.lang.String com.myapppackage.f.c.a()"

我正在 post 回答我用来获取内部索引 json 对象的值。我也期待任何其他解决方案作为答案

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

@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);
    }
})

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