Java 带有JSON的应用程序引擎(Jersey)

Java 带有JSON的应用程序引擎(Jersey),java,json,google-app-engine,jersey,gson,Java,Json,Google App Engine,Jersey,Gson,我正在尝试生成JSON(MediaType.APPLICATION\uJSON)。 如果我使用的是MediaType.APPLICATION_JSON,那么我得到的输出是错误的。 但是每当我使用text/plain时,我都会得到正确的输出。 我想使用MediaType.APPLICATION_JSON来设置正确的头 这个代码正确吗?(我正在使用Jersey+应用程序引擎) 这是错误的输出: "{\"naam\":\"david\",\"leeftijd\":0}" 编辑: 它与XML(Medi

我正在尝试生成JSON(MediaType.APPLICATION\uJSON)。 如果我使用的是MediaType.APPLICATION_JSON,那么我得到的输出是错误的。 但是每当我使用text/plain时,我都会得到正确的输出。 我想使用MediaType.APPLICATION_JSON来设置正确的头

这个代码正确吗?(我正在使用Jersey+应用程序引擎)

这是错误的输出:

"{\"naam\":\"david\",\"leeftijd\":0}"
编辑:

它与XML(MediaType.APPLICATION_XML)完美结合,但在尝试使用JSON时,出现以下错误:

java.lang.NullPointerException
at com.owlike.genson.reflect.BeanViewDescriptorProvider$BeanViewPropertyFactory.createAccessor(BeanViewDescriptorProvider.java:122)
at com.owlike.genson.reflect.BeanPropertyFactory$CompositeFactory.createAccessor(BeanPropertyFactory.java:49)
at com.owlike.genson.reflect.BaseBeanDescriptorProvider.provideMethodAccessors(BaseBeanDescriptorProvider.java:187)
at com.owlike.genson.reflect.BaseBeanDescriptorProvider.provideBeanPropertyAccessors(BaseBeanDescriptorProvider.java:94)
at com.owlike.genson.reflect.AbstractBeanDescriptorProvider.provide(AbstractBeanDescriptorProvider.java:106)
at com.owlike.genson.convert.BasicConvertersFactory.provide(BasicConvertersFactory.java:109)
at com.owlike.genson.convert.BasicConvertersFactory.create(BasicConvertersFactory.java:74)
at com.owlike.genson.convert.BasicConvertersFactory.create(BasicConvertersFactory.java:56)
at com.owlike.genson.reflect.AbstractBeanDescriptorProvider$ContextualFactoryDecorator.create(AbstractBeanDescriptorProvider.java:79)
at com.owlike.genson.reflect.AbstractBeanDescriptorProvider$ContextualFactoryDecorator.create(AbstractBeanDescriptorProvider.java:68)
at com.owlike.genson.convert.ChainedFactory.create(ChainedFactory.java:93)
at com.owlike.genson.convert.ChainedFactory.create(ChainedFactory.java:80)
at com.owlike.genson.convert.ChainedFactory.create(ChainedFactory.java:93)
at com.owlike.genson.convert.ChainedFactory.create(ChainedFactory.java:80)
at com.owlike.genson.convert.ChainedFactory.create(ChainedFactory.java:93)
at com.owlike.genson.convert.ChainedFactory.create(ChainedFactory.java:80)
at com.owlike.genson.convert.CircularClassReferenceConverterFactory.create(CircularClassReferenceConverterFactory.java:58)
at com.owlike.genson.convert.CircularClassReferenceConverterFactory.create(CircularClassReferenceConverterFactory.java:22)
at com.owlike.genson.Genson.provideConverter(Genson.java:196)
at com.owlike.genson.Genson.serialize(Genson.java:340)
at com.owlike.genson.ext.jaxrs.GensonJsonConverter.writeTo(GensonJsonConverter.java:91)
at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:289)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1029)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:941)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:932)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:384)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:451)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:632)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:97)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:487)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

Jersey可以自己处理JSON,只需设置适当的库依赖项:
Jersey JSON.jar
。看这个

在这种情况下,您将直接返回
患者
,Jersey将处理其余的问题:

@Path("all")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Patient getAllPatients(){
    Patient x = new Patient();
    x.setNaam("david");
    return x;
}

我在尝试从json.org使用json时遇到了同样的问题。我从SourceForge切换到jar,其中包括net.sf.json.JSONObject,它可以工作。不知道为什么json.org的版本不起作用。我计划进一步研究它,因为我被要求使用标准实现。我也在使用genson-0.97.jar

更新: 使用json.org,只需将其作为String.class返回,它就可以填充JSONObject

对于单个返回值:

JSONObject jsonObj = new JSONObject(response.readEntity(String.class));
对于值数组:

JSONArray jsonArray = new JSONArray(response.readEntity(String.class));
客户端也可以作为HashMap.class类型接收:

HashMap<String,String> resultsMap = response.readEntity(HashMap.class);
HashMap resultsMap=response.readEntity(HashMap.class);
服务实际以哈希映射的形式接收参数:

@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response getServiceMethod(HashMap<String,String> requestAttributes) {
    ...
    Response finalResponse = Response.ok(somePojoCollection, MediaType.APPLICATION_JSON).build();
    return finalResponse;
}
@POST
@产生(MediaType.APPLICATION_JSON)
@使用(MediaType.APPLICATION_JSON)
公共响应getServiceMethod(HashMap requestAttributes){
...
Response finalResponse=Response.ok(somePojoCollection,MediaType.APPLICATION_JSON).build();
返回最终响应;
}
完整客户端示例:

private JSONObject executeService(AuthRequest inputAttributes) {
    Client client = ClientBuilder.newClient();
    WebTarget target = client.target("http://localhost:8080").path(
        "TestRestService2/rest/GetTestService");
    Entity<AuthRequest> entity = Entity.entity(inputAttributes,
            MediaType.APPLICATION_JSON);
    Builder request = target.request(MediaType.APPLICATION_JSON);
    Response response = request.buildPost(entity).invoke();
    JSONArray jsonArray = new JSONArray(response.readEntity(String.class));
    JSONObject json = (JSONObject)jsonArray.get(0);
    return json;
}
私有JSONObject executeService(AuthRequest InputAttribute){
Client Client=ClientBuilder.newClient();
WebTarget=client.target(“http://localhost:80801.路径(
“TestRestService2/rest/GetTestService”);
实体=实体。实体(输入属性,
MediaType.APPLICATION_JSON);
Builder request=target.request(MediaType.APPLICATION\u JSON);
Response=request.buildPost(entity.invoke();
JSONArray-JSONArray=newjsonarray(response.readEntity(String.class));
JSONObject json=(JSONObject)jsonArray.get(0);
返回json;
}
还可以通过客户机传递JSONObject,但如果使用json.org,则使用toString()

JSONObject InputAttribute=新的JSONObject(myHashMap);
实体=实体.Entity(InputAttribute.toString(),
MediaType.APPLICATION_JSON);

让Jersey来处理序列化,而不是手动进行序列化。将方法更改为返回Patient而不是String,仅此而已。您不应该再使用周围的引号。

没有Maven,您可以这样做吗?我尝试下载maven app engine插件,并在pom文件中添加依赖项,并在我的app engine项目中引用该项目,但这似乎不起作用。当然,只需将此库添加到您的项目中。我如何做到这一点?我尝试了builth path->add libraries,但是我可以选择插件(库)的唯一选项是android类路径容器?有什么想法吗?提前感谢使用genson 0.98
private JSONObject executeService(AuthRequest inputAttributes) {
    Client client = ClientBuilder.newClient();
    WebTarget target = client.target("http://localhost:8080").path(
        "TestRestService2/rest/GetTestService");
    Entity<AuthRequest> entity = Entity.entity(inputAttributes,
            MediaType.APPLICATION_JSON);
    Builder request = target.request(MediaType.APPLICATION_JSON);
    Response response = request.buildPost(entity).invoke();
    JSONArray jsonArray = new JSONArray(response.readEntity(String.class));
    JSONObject json = (JSONObject)jsonArray.get(0);
    return json;
}
JSONObject inputAttributes = new JSONObject(myHashMap);
Entity<String> entity = Entity.entity(inputAttributes.toString(),
                       MediaType.APPLICATION_JSON);