[英]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对象):
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jettison</artifactId> <version>2.26</version> </dependency>
<init-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value>org.glassfish.jersey.jettison.JettisonFeature</param-value> <init-param>
@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数据:
依赖性:如果您使用的是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添加到类路径中。
定义POJO以包含要序列化为JSON的数据,例如,
public class User { private String username; private String email; // getters + setters }
相应地修改您的资源方法:
@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.