如何在Java响应对象中返回JsonArray

如何在Java响应对象中返回JsonArray,java,json,web-services,Java,Json,Web Services,我正在尝试实现基于java的web服务服务器,它返回到基于Json和java脚本的web服务客户端。以下是我的java部分: @Path("/myapp") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public class MyRecommender { @POST @Path("/recs") public Re

我正在尝试实现基于java的web服务服务器,它返回到基于Json和java脚本的web服务客户端。以下是我的java部分:

@Path("/myapp")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class MyRecommender {
            @POST
            @Path("/recs")
            public Response getRecommendations() {
                //Assume recommendation List contains some Recommendation objects 
                //I removed it for simplicity.            
                List<Recommendation> recommendation;
                JsonArrayBuilder builder = Json.createArrayBuilder();
                for (Recommendation rec : recommendations) {
                    builder.add(Json.createObjectBuilder().add("firstPersonName", "\"" + rec.getFirstPerson().getName() + "\"")
                            .add("firsPersonURL", "\"" + rec.getFirstPerson().getURL() + "\"")
                            .add("secondPersonName", "\"" + rec.getSecondPerson().getName() + "\"")
                            .add("secondPersonURL", "\"" + rec.getSecondPerson().getURL() + "\"")
                            .add("score", "\"" + rec.getSimilarity() + "\""));
                }
                JsonArray jsonData = builder.build();
                return Response.ok(jsonData, MediaType.APPLICATION_JSON).header("Access-Control-Allow-Origin", "*")
                        .header("Access-Control-Allow-Methods", "POST").allow("OPTIONS").build();
            }
        }
}
但是当我替换for循环并返回以下代码时,我在js中得到了正确的响应

更改部分:

// remove for loop and change jsonData type.
  String jsonData = "{\"name\":\"John\"}";
  return Response.ok(jsonData, MediaType.APPLICATION_JSON).header("Access-Control-Allow-Origin", "*")
          .header("Access-Control-Allow-Methods", "POST").allow("OPTIONS").build();
所以,我想知道可能有什么问题?因为这是我第一次使用web服务,所以调试代码有一些困难

编辑

顺便说一下,当我尝试使用第一个版本的getRecommensions()函数(使用循环)时,我还遇到了另一个错误

但是正如我所说的,当我删除循环并将第二个代码插入getRecommensions()函数时,这两个错误都消失了,我的网站上也得到了响应

EDIT2

当我用下面的命令更改getRecommensions()函数的循环和返回语句时,我再次get出现相同的错误

 JsonObject value = Json.createObjectBuilder()
                .add("name", "John").build();
return Response.ok(value, MediaType.APPLICATION_JSON).header("Access-Control-Allow-Origin", "*")
              .header("Access-Control-Allow-Methods", "POST").allow("OPTIONS").build();
编辑3


据我所知,
createObjectBuilder().build()
JsonArrayBuilder.build()
返回一个
JSON对象
,甚至我的GetRecommensions()函数中的这个build语句的下面部分都没有运行。所以,我想我的问题是,我如何才能授予访问控制允许源站对此对象的权限?

您应该尝试最简单的方法:

return Response.ok().entity(recommendation).header("Access-Control-Allow-Origin", "*")
                    .header("Access-Control-Allow-Methods", "POST").allow("OPTIONS").build();

如果可以使用第三方库,那么在这种情况下,使用谷歌的Gson可能是一个有效的解决方案。将模型转换为JSON非常方便。 你能做的就是这样

ArrayList recommendationList=new ArrayList()
Gson Gson=新的Gson(); 字符串jsonData=gson.toJson(reccomendationList)

要将其用作POM文件中的依赖项,可以这样做

<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>2.3.1</version>
  <scope>compile</scope>
</dependency>

com.google.code.gson
格森
2.3.1
编译

HTTP 500是一个内部服务器错误。您是否检查了服务器是否已连接且工作正常?@SudiptoChandra yea,正如我所说,如果我用截取的第二个代码替换getRecommensions()函数的循环和返回语句,则它工作正常。因此,我认为不会有任何连接问题。IMHO
getRecommensions()
应该用
@GET
@petermm注释。请问您为什么这样想?前缀和后缀是“我觉得不对。当我尝试你的解决方案时,我也会遇到同样的错误。你确定
推荐=空值
?在任何情况下,您都可以将方法体包装在try{}catch()中并打印stacktrace。(为了简单起见,我在问题中删除了它)
return Response.ok().entity(recommendation).header("Access-Control-Allow-Origin", "*")
                    .header("Access-Control-Allow-Methods", "POST").allow("OPTIONS").build();
<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>2.3.1</version>
  <scope>compile</scope>
</dependency>