Java RESTWeb服务JSON格式

Java RESTWeb服务JSON格式,java,json,web-services,rest,Java,Json,Web Services,Rest,我正在尝试创建一个RESTWeb服务,它返回用户的详细信息 这是我的密码: //Actual web service methods implemented from here @GET @Path("login/{email}/{password}") @Produces("application/json") public Tourist loginUser(@PathParam("email") String email, @PathParam("passw

我正在尝试创建一个RESTWeb服务,它返回用户的详细信息

这是我的密码:

//Actual web service methods implemented from here
    @GET
    @Path("login/{email}/{password}")
    @Produces("application/json")
    public Tourist loginUser(@PathParam("email") String email, @PathParam("password") String password) {
        List<Tourist> tourists = super.findAll();
        for (Tourist tourist : tourists) {
            if (tourist.getEmail().equals(email) && tourist.getPassword().equals(password)) {
                return tourist;
            }
        }
        //if we got here the login failed
        return null;
    }
我需要的是:

    {"tourist":{
            "email": "adrian.olar@email.ro",
            "fname": "Adrian",
            "lname": "Olar",
            "touristId": 1
        }
    }
我需要向我的代码中添加什么才能生成此对象?

如果您真的想将
游客
包装到另一个对象中,您可以这样做

tourism.java

package entities;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Tourist {

    int touristId;
    String email;
    String fname;
    String lname;
package entities;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class TouristWrapper {

    Tourist tourist;
package rest;

import entities.Tourist;
import entities.TouristWrapper;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

@Path("/so")
public class SOResource {

    @GET
    @Path("/tourists/{id}")
    @Produces("application/json")
    public TouristWrapper loginUser(@PathParam("id") int id) {
        Tourist tourist = new Tourist(id, "foo@example.com", "John", "Doe");
        TouristWrapper touristWrapper = new TouristWrapper(tourist);
        return touristWrapper;
    }
}
TouristWrapper.java

package entities;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Tourist {

    int touristId;
    String email;
    String fname;
    String lname;
package entities;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class TouristWrapper {

    Tourist tourist;
package rest;

import entities.Tourist;
import entities.TouristWrapper;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

@Path("/so")
public class SOResource {

    @GET
    @Path("/tourists/{id}")
    @Produces("application/json")
    public TouristWrapper loginUser(@PathParam("id") int id) {
        Tourist tourist = new Tourist(id, "foo@example.com", "John", "Doe");
        TouristWrapper touristWrapper = new TouristWrapper(tourist);
        return touristWrapper;
    }
}
SOResource.java

package entities;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Tourist {

    int touristId;
    String email;
    String fname;
    String lname;
package entities;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class TouristWrapper {

    Tourist tourist;
package rest;

import entities.Tourist;
import entities.TouristWrapper;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

@Path("/so")
public class SOResource {

    @GET
    @Path("/tourists/{id}")
    @Produces("application/json")
    public TouristWrapper loginUser(@PathParam("id") int id) {
        Tourist tourist = new Tourist(id, "foo@example.com", "John", "Doe");
        TouristWrapper touristWrapper = new TouristWrapper(tourist);
        return touristWrapper;
    }
}
我已经简化了您的用例,但您明白了一点:不返回
tourism
,而是返回一个
tourismwrapper
。返回的JSON如下所示:

{
    "tourist": {
        "email": "foo@example.com",
        "fname": "John",
        "lname": "Doe",
        "touristId": 1
    }
}

这不是一个有效的JSON,因此在不违反规范的情况下不能使用。您确定这正是您想要的吗?这不是REST服务。json中的链接在哪里?@inf3rno链接不是REST所必需的。我不确定这是否只是一个示例,但您不应该通过GET提交密码信息,因为它会被缓存和检查。@Tichodromuraria您大错特错了。REST应该总是返回超媒体,而不仅仅是普通数据。谢谢,这是我一直在寻找的,我会试试这个