如何将JSON对象映射到Java对象?

时间:2015-06-06 09:44:56

标签: java json resteasy

我已经使用Postman API客户端测试了REST服务,该客户端将JSON对象传递给服务。

JSON对象

{
    "username" : "user",
    "password" : "pass"
}

正确完成到Java对象的映射,并以响应状态200返回。

如何在对REST服务方法的操作中完成Java对象映射的JSON对象。

UserCl Class

static class UserCl{

        private String uname;
        private String password;
        private String name;

        public UserCl(){
        }

        public String getName() {
            return name;
        }

        public void setName(String pname) {
            this.name = pname;
        }

        public String getUsername() {
            return uname;
        }
        public void setUsername(String pusername) {
            this.uname = pusername;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String ppassword) {
            this.password = ppassword;
        }

    }

REST服务方法

@PermitAll
@POST   
@Consumes(MediaType.APPLICATION_JSON)
@Path("/auth")
public Response login(UserCl usr){

    if(usr.getUsername().compareTo("user") == 0 && usr.getPassword().compareTo("pass") == 0){

    String usernameAndPassword = usr.getUsername() + ":" + usr.getPassword(); 

    try {               

            String base64String = Base64Encoder.encode(usernameAndPassword);
            System.out.println(base64String);                               

            return Response.status(200).build();


        } catch (IOException e) {           
            e.printStackTrace();        
            return Response.status(401).build();                
        }   
    }
    else{       
        return Response.status(401)build();
    }

}   

2 个答案:

答案 0 :(得分:2)

Resteasy默认使用杰克逊。基本行为(与大多数序列化框架一样)是查找JavaBean属性(getters / setters)。对于反序列化,setter是内省的。他们应该遵循JavaBean naming convention。如果你的情况

private String username;

public void setUsername(String string) {}

从方法名称中删除set,并将第一个字母缩小。因此setUsername映射到"username" JSON属性。

序列化时,将使用getter。就像反序列化一样,get被剥离,第一个字母更低。因此getUsername会在生成的JSON中添加"username"属性。

也可以使用Jackson注释来更改属性名称。例如

@JsonProperty("name")
private String username;

但是这需要你将Jackson作为编译时依赖项添加到你的项目中。

修改

只是在杰克逊补充说,我们不 使用JavaBean属性。即使使用公共字段,也将使用字段的名称。不是真的推荐,只是想我把它扔出去。

答案 1 :(得分:1)

通常使用反射来实现。 Java能够使用其名称访问对象的方法和字段。这称为反射。在您的情况下,您正在使用的JSON库具有这种魔力。

首先,它找到必须实例化的类。它从方法login()的参数类型中获取。它使用像

这样的代码创建实例
Class.forName("UserCl").newInstance()

(这需要公共默认构造函数。您的类没有定义任何构造函数,因此隐式地有一个默认构造函数。)

然后它会发现类UserCl,找到setPassword()setUsername()并调用它们传递适当JSON属性的值。

有关java reflection API的更多信息,请参阅。