繁体   English   中英

无法从我的其他api中检索JSONObject

[英]Can't retrieve JSONObject from my rest api

所以我最近从Jersey 1.x搬到了2.x,经过一长串的问题后,最终得到了它。 但每当我尝试访问返回JSONObject的资源时,我都会遇到问题。 首先,这是我的示例方法:

@GET
@Path("/foobar")
@Produces(MediaType.APPLICATION_JSON)
public JSONObject print2() throws JSONException {
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("hi", 22);
    return jsonObject;
}

现在如果我将Jettison 1.3.8用于我的JSONObject,如果我尝试访问此资源,我会得到以下内容:

{"escapeForwardSlashAlways":true}

不知道那里发生了什么。 然后我尝试了一些旧版本的Jettison和org.json,但这些给了我这个问题:

No serializer found for class org.json.JSONObject and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) )

不知道为什么当这种方法在Jersey 1.x上适合我时,我会遇到这些问题。

我正在努力解决同样的问题,最终泽西的书签问题有所帮助。

问题是你的Jersey没有JSONObject序列化器,它试图使用BeanSerializer。 Jettison JSONObject只有一个公共getter( isEscapeForwardSlashAlways ),而org.json.JSONObject就没有getter,因此无法应用BeanSerializer

解决方案是(jettison json对象):

  1. 添加依赖项jersey-media-json-jettison:
 <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jettison</artifactId> <version>2.26</version> </dependency> 
  1. 在web.xml中以声明方式注册jettison功能
 <init-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value>org.glassfish.jersey.jettison.JettisonFeature</param-value> <init-param> 
  1. 或以编程方式在您的应用程序中
 @ApplicationPath("/") public class MyApplication extends ResourceConfig { public MyApplication() { registerClasses(UsersResource.class); register(new JettisonFeature()); } } 

web.xml中:

<init-param>
     <param-name>javax.ws.rs.Application</param-name>
     <param-value>org.glassfish.jersey.examples.bookmark.MyApplication</param-value>
</init-param>

也许org.json.JSONObject也有泽西的序列化功能,我不知道......

假设您使用的是Servlet 3.0及更高版本,以下示例可帮助您设置环境以使用JSON数据:

  1. 依赖性:如果您使用的是Maven,则需要以下依赖项:

     <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet</artifactId> <version>2.23.2</version> </dependency> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>2.23.2</version> </dependency> 

如果您不使用Maven,则需要将相应的jar添加到类路径中。

  1. 定义POJO以包含要序列化为JSON的数据,例如,

     public class User { private String username; private String email; // getters + setters } 
  2. 相应地修改您的资源方法:

     @GET @Path("/foobar") @Produces(MediaType.APPLICATION_JSON) public User print2() { User jsonObject = new User(); jsonObject.setUsername("Me"); jsonObject.setEmail("my@email.com"); return jsonObject; } 

打包和部署,输出应该是:

{“username”:“我”,“电子邮件”:“my@email.com”}

注意:此示例已部署并适用于Tomcat 8.5.5。

另一种选择是允许Response将您的对象转换为JSON。 这提供了添加HTTP代码的额外好处。 因此,您可以返回400,404,500等,并仍然发送回JSON响应,您的JS可以采取行动。 您应该能够将JSONObject放在那里,因为它基本上只是扩展Map - 或任何对象。

@GET
@Path("/foobar")
@Produces(MediaType.APPLICATION_JSON)
public Response print2() {
    User jsonObject = new User();
    jsonObject.setUsername("Me");
    jsonObject.setEmail("my@email.com");
    return Response.status(Response.Status.OK).entity(jsonObject).build());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM