如何使用AndroidAnnotations解析对POJO的JSON响应?

时间:2014-05-25 20:16:01

标签: java android rest android-annotations

我正在使用AndroidAnnotations为Android应用程序构建Rest。 在Serverside上使用PHP,它发送一个类似于json的json:

{"tag":"register","success":0,"error":2,"msg":"User already existed","body":[]}

我有两个POJOS:

User.java:

public class User implements Serializable {
    private String name;
private String email;
private String password;

    //getter and setter Methods
}

Response.java:

public class RegistrationResponse implements Serializable {

private String tag;
private int success;
private int error;
private String msg;
private String body;

    //getter and setter Methods
}

休息客户:

@Rest(rootUrl = "http://my.domain.com", converters = {
    MappingJacksonHttpMessageConverter.class,
    StringHttpMessageConverter.class, GsonHttpMessageConverter.class }, interceptors = { MyInterceptor.class })
public interface RestClient extends RestClientErrorHandling {
    @Post("/user/register/{name}/{email}/{pass}")
    @Accept(MediaType.APPLICATION_JSON_VALUE)
    Response sendUserRegistration(User user, String name, String email,
        String pass);

    RestTemplate getRestTemplate();
}

Activity.java:

//User and Response are POJOs
Response result = RestClient.sendUserRegistration(user,
                user.getName(),user.getEmail(),user.getPassword());

但是我在Activity.java上遇到了 Null Pointer Exception错误。但是,如果我将“sendUserRegistration”函数的返回值更改为字符串,则所有工作都可以。所以我的“响应”POJO 似乎不会从AndroidAnnotations转换。

如何使用AndroidAnnotations将Rest响应转换为“Response”-POJO

2 个答案:

答案 0 :(得分:0)

AA依靠Spring Android RestTemplate进行其余调用。并且为了构建请求并处理响应,这个lib使用转换器。要知道RestTemplate应该使用哪个转换器,它会检查content-type响应头。 由于MappingJacksonHttpMessageConverterGsonHttpMessageConverter仅处理带有content-type=application/json的http响应,并且您的结果转换为字符串,我很确定您忘记在php服务器中设置此标头。因此它发送默认值(即:text/plain),只能由StringHttpMessageConverter处理。

此外,body字段是json示例中的对象,但在您的POJO中,您将其声明为String。因此,在这一点上解析将失败。

答案 1 :(得分:0)

每次休息调用都不需要返回整个响应对象,只需将响应设置为自定义对象即可。或者您也可以返回一个JsonObject并稍后使用gson进行转换。

@Rest(rootUrl = "http://my.domain.com", converters = {
MappingJacksonHttpMessageConverter.class,
StringHttpMessageConverter.class, GsonHttpMessageConverter.class }, interceptors = {   MyInterceptor.class })
public interface RestClient extends RestClientErrorHandling {

    @Post("/user/register/{name}/{email}/{pass}")
    @Accept(MediaType.APPLICATION_JSON_VALUE)
    User sendUserRegistration(User user, String name, String email,
    String pass);

    RestTemplate getRestTemplate();
}

然后只需致电

User newUser = RestClient.sendUserRegistration(user,
                user.getName(),user.getEmail(),user.getPassword());