如何在java中创建通用json响应对象?
我是java新手,并使用jersey框架在netbeans中创建了一些Restful服务 我创建了许多GET、POST web服务,这些服务具有不同类型的响应,这些响应基本上是模型对象,根据媒体类型,我获得的是JSON或XML 有些响应只有一个对象,该对象在{}内的JSON中显示,有些是在[]中的list。 我希望看到所有api响应的通用响应格式 示例- {“状态”:“0或1”,“消息”:“任何字符串消息”,“结果”:“它可以是单个对象或对象列表,根据每个web服务响应而动态”} 因为在java中,我们需要创建模型对象来获取响应,所以我创建了一个具有status属性的ResponseModel,message属性,但不知道result属性的类型,因为有时它可以有一个对象,有时它可以有一个列表,所以我应该为这个属性设置什么类型,这样我就可以为这个属性分配任何东西,并且对于JSON或XML,响应将始终采用相同的格式 我用构造函数创建了一个静态方法,它接受所有这三个参数并创建一个ResponseModel对象 提前谢谢 已编辑-将“对象”用作泛型类型后的代码如何在java中创建通用json响应对象?,java,json,web-services,generics,jersey,Java,Json,Web Services,Generics,Jersey,我是java新手,并使用jersey框架在netbeans中创建了一些Restful服务 我创建了许多GET、POST web服务,这些服务具有不同类型的响应,这些响应基本上是模型对象,根据媒体类型,我获得的是JSON或XML 有些响应只有一个对象,该对象在{}内的JSON中显示,有些是在[]中的list。 我希望看到所有api响应的通用响应格式 示例- {“状态”:“0或1”,“消息”:“任何字符串消息”,“结果”:“它可以是单个对象或对象列表,根据每个web服务响应而动态”} 因为在java
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();
}
}
结果参数是一个普通的模型对象。您可以像前面所说的那样简单地创建类
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();
}
//在响应模型中返回单个对象
@得到
@路径(“/myMethod”)
公众响应aJerseyMethod(){
Book aBookObject=新书(“书名”、“作者姓名”);
ResponseModel ResponseModel=新的ResponseModel(1,“这是一本书”,aBookObject);
返回Response.ok(responseModel)
.build();
}
//在响应模型中返回数组
@得到
@路径(“/myOtherMethod”)
公众反应另一种方法(){
Book aBookObject=新书(“书名”、“作者姓名”);
Book anotherBookObject=新书(“其他书名”、“其他作者姓名”);
ArrayList aBookArray=新的ArrayList();
添加(aBookObject);
添加(另一个BookObject);
ResponseModel ResponseModel=新的ResponseModel(1,“这些是书”,aBookArray);
返回Response.ok(responseModel)
.build();
}
在这两种情况下,您都应该得到您所谈论的预期输出,而不必自己进行任何额外的检查或转换
我刚刚在这里写了这篇文章,所以请用您自己的类而不是“Book”(这不是一个真正的类)来尝试它,并告诉我它是否有效。您不应该在json正文中维护状态代码、消息和结果
你不能将结果的类型设置为“Object”,那么无论你在哪里需要使用它,你都可以检查它是属于List类型,还是属于mapi类型。在他的示例json中,他表示状态为0或1,所以我认为他不打算将其用作http状态。我更新了答案中的示例,以避免混淆任何人。根据标准,您不应使用状态0或1,人们可以使用他们想使用的任何方式,但我提到了标准方法,正如他在问题中所问。当我使用您的方法创建“Object”类型变量时,我收到了一条消息,状态正确,但在结果键中我看到的是包名而不是JSON对象。示例-{“消息”:“成功”,“结果”:“com.companyname.appname”。MemberModel@44a20e87,“status”:1}@NavneetSharma Show come-code-maybe。这看起来像是引用的toString。@NavneetSharma您的
LGSResponse
类是否有getter和setter?另外,您在json转换器库中使用的Jersey版本是什么?另外,我假设您有正确的注释,即@Path
,@GET
和@products
是的,LGSResponse类同时具有getter和setter,Jersey版本是2.5.1,它使用任何内部库来生成JSON,Path GET products是正确的。当我提到“Object”类型以返回模型类型时,我可以看到正确的JSON结果,但我想创建一个通用响应模型,它可以有任何模型类型的对象。