Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中创建通用json响应对象?_Java_Json_Web Services_Generics_Jersey - Fatal编程技术网

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

如何在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

我是java新手,并使用jersey框架在netbeans中创建了一些Restful服务

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

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

示例- {“状态”:“0或1”,“消息”:“任何字符串消息”,“结果”:“它可以是单个对象或对象列表,根据每个web服务响应而动态”}

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

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

提前谢谢

已编辑-将“对象”用作泛型类型后的代码

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正文中维护状态代码、消息和结果

  • 响应消息应仅包含该api的结果
  • Httpstatus代码将是状态代码(Ex.200为成功,404为未找到)
  • 所有其他信息都应该保存在响应头中,而不是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结果,但我想创建一个通用响应模型,它可以有任何模型类型的对象。