将JSON字符串转换为JSON对象

时间:2016-02-18 00:35:48

标签: angularjs json ajax rest

我正在使用AJAX向RESTful Web服务发出以下PUT请求。在发出请求之前,我将表单提交(使用ng-submit)返回的数据转换为JSON字符串:

var serializedData =angular.toJson(person);

然后我将它作为数据发送到这样的AJAX调用中:

    $http({
        method: 'PUT',
        url: myurl +person.personID,
        data: serializedData,
        headers: {
            'Content-Type': 'application/json'
        }
    }).success(function(data) {

        console.log("Success");

    });

现在在我的Web服务中,我想获取这些数据并创建一个Java对象:

@PUT
    @Path("/person/{id}")
    @Produces({ MediaType.APPLICATION_JSON }) 
    @Consumes({MediaType.APPLICATION_JSON}) 
public Response updatePerson(@PathParam("id") String personID,
        @Context HttpServletRequest httpRequest) {


    Response.ResponseBuilder builder = Response.ok();
    Person person =null;
    String data =null;
    BufferedReader reader =null;
    StringBuffer buffer = new StringBuffer();
    try
    {
        reader = new BufferedReader(new InputStreamReader(httpRequest.getInputStream()));
    }
    catch (IOException e1)
    {
        e1.printStackTrace();
        e1.getCause().toString();
    }

    try
    {
        while((data =reader.readLine()) != null){
            buffer.append(data);
        }
    }
    catch (IOException e1)
    {
        e1.printStackTrace();
    }
    String bufferToString =buffer.toString();


    try
    {
        person =JSONUtil.toObject(bufferToString, new TypeReference<Person>() {});
    }
    catch (JsonParseException e1)
    {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    catch (JsonMappingException e1)
    {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    catch (IOException e1)
    {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    if (person == null) {
        builder = Response
                .status(Response.Status.NOT_FOUND.getStatusCode());
        return builder.build();
    }

    try {

        deviceService.update(dev);
        JSONUtil.toJSONString(dev);
        builder.entity(JSONUtil.toJSONString(dev));
    } catch (JsonGenerationException e) {
    } catch (JsonMappingException e) {
    } catch (IOException e) {

    return builder.build();  
}

这是一个我似乎无法弄清楚的问题。当进行ajax调用时,数据会到达Web服务,这意味着它是一个JSON字符串,因为这是angular.toJson所做的[https://docs.angularjs.org/api/ng/function/angular.toJson]。用读取器读取它并将其转换为字符串并将其传递给JSONUtil.toObject(bufferToString, new TypeReference<Person>() {});后,它会给我一个404状态代码,这意味着person对象为null。现在这是我不明白的奇怪的事情。如果我在POSTMAN客户端中对Person对象执行get请求,请编辑该JSON中的值并将其作为application / json类型的主体发送到PUT请求(来自POSTMAN),然后它就可以了。我已经通过JSONLint检查了我从AJAX收到的JSON字符串是否有效..为什么会发生这种情况?我将一个字符串传递给JSONUtil.toObject(bufferToString, new TypeReference<Person>() {});,这是该方法所需要的。它的格式不正确吗?我似乎无法理解。任何帮助将不胜感激。现在已经坚持了4个小时。谢谢。

2 个答案:

答案 0 :(得分:1)

我发布这个作为答案,因为我还没有发表评论。以下是重构代码以使其更容易保持的建议。如果不这样做,我建议您在控制台上发布StackTrace,以提供进一步的帮助。

现在建议: 你应该试试JAX-B。它使您的代码更易于管理,并使您免于手动执行序列化和反序列化的hazzard。您可以将所有JAX-B POJO用作参数或返回类型:

@POST
public StatusDTO createStatus(StatusDTO dto) {
    //your code here
}

您需要做的就是创建一个POJO并使用@XmlRootElement对其进行注释,您可以直接将其用作Jersey服务中的参数。

有了这个,您可以返回POJO,JAX-B将进行序列化,因此您也不必手动构建响应。最后,每当您需要返回错误代码时,请尝试抛出WebApplicationException

答案 1 :(得分:0)

你需要其他解决方案来使用Java中的json,在Spring中使用Jersey和Jackson,我将json对象捕获到java pojo,请查看此示例https://github.com/ripper2hl/angular-todo/

并且catch对象的代码非常简单 @RequestMapping(method = RequestMethod.POST) public Todo saveTodo(@RequestBody Todo todo){ return todoDao.save(todo); }