如何在java中创建通用的json响应对象?

时间:2018-01-28 10:33:32

标签: java json web-services generics jersey

我是java的新手,并使用jersey framework在netbeans中创建一些Restful服务。

我创建了许多GET,POST Web服务,这些服务具有不同类型的响应,基本上是模型对象,并且根据媒体类型,我得到JSON或XML。

有些响应只有一个对象在{}中显示在JSON中,有些是在[]中的列表。 我希望看到所有api响应的通用响应格式。

示例 - {" status":" 0或1"," message":"任何字符串消息","结果": "它可以是单个对象或动态对象列表,具体取决于每个Web服务响应"}。

因为在java中我们需要创建模型对象以获取响应所以我创建了一个ResponseModel,它具有status属性,message属性但不知道result属性的类型,因为有时它可以有一个对象或某个时候一个列表,所以我应该为这个属性设置什么类型,以便我可以为此分配任何东西,并且响应将始终采用相同的JSON或XML格式。

我用构造函数创建了一个静态方法,它接受所有这三个参数并创建一个ResponseModel对象。

提前致谢

EDITED-使用后的代码"对象"作为通用类型

public static Response getResponseObjectIsValid(boolean isValid, String message,Object result)
{


    if (isValid == true) { 
       LGSResponse response = new LGSResponse();
       response.setStatus(1);
       response.setMessage(message.length()>0 ? message : "Success");
       response.setResult(result);

      return  Response.status(Status.OK).entity(response).build();

    }
    else 
    {
      LGSResponse response = new LGSResponse();
      response.setStatus(1);
       response.setMessage(message.length()>0 ? message : "Failed");
       response.setResult(result);

       return  Response.status(Status.OK).entity(response).build();
    }
}

结果参数是普通模型对象。

2 个答案:

答案 0 :(得分:2)

你可以像你说的那样简单地创建你的课程。

public class ResponseModel {
    int status;
    String message;
    Object result;

    // contructor, getters, setters go here...
    // (probably consider using lombok, but that is a story for another time)
}

然后你可以传递一个对象或一个数组作为第三个参数,json / xml序列化器应该为你处理转换,除非你的对象非常复杂(我很少遇到这个问题)

例如,您的Jersey方法看起来像这样:

// returning a single object within the response model
@GET
@Path("/myMethod")
public Response aJerseyMethod() {

    Book aBookObject = new Book("The Title", "Name of Author");

    ResponseModel responseModel = new ResponseModel(1, "This is a book", aBookObject);

    return Response.ok(responseModel)
                .build();
}

// returning an array within the response model
@GET
@Path("/myOtherMethod")
public Response anotherJerseyMethod() {

    Book aBookObject = new Book("The Title", "Name of Author");
    Book anotherBookObject = new Book("The Other Title", "Name of another Author");

    ArrayList<Book> aBookArray = new Arraylist();
    aBookArray.add(aBookObject);
    aBookArray.add(anotherBookObject);

    ResponseModel responseModel = new ResponseModel(1, "These are books", aBookArray);

    return Response.ok(responseModel)
                .build();
}

在这两种情况下,您都应该获得您所谈论的预期输出,而您不必自己进行任何额外的检查或转换。

我刚刚在这里写了这个,所以请用自己的课程而不是“Book”(这不是真正的课程)试试,如果有效的话请告诉我。

答案 1 :(得分:0)

您不应该在json正文中维护状态代码,消息和结果。

  1. 响应消息应仅包含该api的结果。
  2. Httpstatus代码将是状态代码(Ex.200成功,404未发现)
  3. 所有其他信息都应保留在响应标头中,而不是在json body