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

时间:2016-10-15 20:58:23

标签: java jersey-2.0 jsonobject

所以我最近从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上,当这种方法适合我时,我不确定为什么会出现这些问题。

3 个答案:

答案 0 :(得分:1)

假设您使用的是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>
    
  2. 如果您不使用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;
      }
      
    3. 打包和部署,输出应为:

        

      {       &#34;用户名&#34;:&#34;我&#34;,       &#34;电子邮件&#34;:&#34; my@email.com"   }

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

答案 1 :(得分:0)

另一种选择是允许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());
}

答案 2 :(得分:0)

我正在努力解决同样的问题,最终Jersey's bookmark exmple帮助了。

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

解决方案适用于(jettison json对象):

  1. 添加依赖项jersey-media-json-jettison:
  2. <dependency>
         <groupId>org.glassfish.jersey.media</groupId>
         <artifactId>jersey-media-json-jettison</artifactId>
         <version>2.26</version>
    </dependency>
    
    1. 以声明方式在web.xml中注册jettison功能
    2. <init-param>
           <param-name>jersey.config.server.provider.classnames</param-name>
           <param-value>org.glassfish.jersey.jettison.JettisonFeature</param-value>
      <init-param>
      
      1. 或以编程方式在您的应用程序中:
      2. @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也有泽西的序列化功能,我不知道......