【问题标题】:How to create generic json response Object in java?如何在 java 中创建通用 json 响应对象?
【发布时间】:2018-01-28 10:33:32
【问题描述】:

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

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

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

示例- {"status":"0 or 1", "message":"any string message","re​​sult":"它可以是单个对象或对象列表,根据每个 Web 服务响应是动态的"}.

由于在 java 中我们需要创建模型对象来获取响应,所以我创建了一个 ResponseModel,它具有状态属性、消息属性但不知道结果属性的类型,因为有时它可以有一个对象或有时是一个列表,所以我应该为这个属性设置什么类型,以便我可以为它分配任何东西,并且响应对于 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();
    }
}

Result Parameter 是一个普通的模型对象。

【问题讨论】:

  • 不能把result的类型设置为“Object”,那么在需要用到的地方,可以查看是List类型,还是Map类型

标签: java json web-services generics jersey


【解决方案1】:

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

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”(这不是一个真正的类)试试它,如果它有效,请告诉我。

【讨论】:

  • 当我使用您的方法创建“对象”类型变量时,作为响应,我得到消息,状态正确,但在结果键中,我看到的是包名称而不是 JSON 对象。示例 - {"message":"Success","re​​sult":"com.companyname.appname.MemberModel@44a20e87","status":1}
  • @NavneetSharma 也许可以显示代码。看起来它是一个引用的 toString。
  • @NavneetSharma 你的LGSResponse 班级有getter 和setter 吗?另外,您使用什么版本的 Jersey 和什么 json 转换器库?附言我假设您有正确的注释,即 @Path@GET@Produces
  • 是的 LGSResponse 类同时具有 getter 和 setter,Jersey 版本是 2.5.1,它使用任何内部库来生成 JSON,Path Get Produces 是正确的。当我提到“对象”类型来返回模型类型时,我可以看到正确的 JSON 结果,但我想创建一个可以具有任何模型类型对象的通用响应模型。
【解决方案2】:

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

  1. 响应消息应仅包含该 api 的结果。
  2. Httpstatus 码将是状态码(例如 200 是成功,404 是找不到)
  3. 所有其他信息都应保留在响应标头中,而不是在 json 正文中

【讨论】:

  • 在他的示例 json 中,他声明状态 0 或 1,所以我认为他不打算将其用作 http 状态。我更新了答案中的示例,以免混淆任何人。
  • 您不应该按照标准使用状态 0 或 1,可以使用他们想使用的任何方式,但我提到了标准的做法,正如他所问的那样。
猜你喜欢
  • 2022-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多