Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 将JSON字符串转换为JSON对象_Angularjs_Json_Ajax_Rest - Fatal编程技术网

Angularjs 将JSON字符串转换为JSON对象

Angularjs 将JSON字符串转换为JSON对象,angularjs,json,ajax,rest,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,

我使用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();  
}
@PUT
@路径(“/person/{id}”)
@产生({MediaType.APPLICATION_JSON})
@使用({MediaType.APPLICATION_JSON})
公共响应updatePerson(@PathParam(“id”)字符串personID,
@上下文HttpServletRequest(httpRequest){
Response.ResponseBuilder=Response.ok();
Person=null;
字符串数据=null;
BufferedReader reader=null;
StringBuffer=新的StringBuffer();
尝试
{
reader=new BufferedReader(new InputStreamReader(httpRequest.getInputStream());
}
捕获(IOE1异常)
{
e1.printStackTrace();
e1.getCause().toString();
}
尝试
{
而((data=reader.readLine())!=null){
附加(数据);
}
}
捕获(IOE1异常)
{
e1.printStackTrace();
}
字符串bufferToString=buffer.toString();
尝试
{
person=JSONUtil.toObject(bufferToString,new TypeReference(){});
}
捕获(JsonParseException e1)
{
//TODO自动生成的捕捉块
e1.printStackTrace();
}
捕获(JsonMappingException e1)
{
//TODO自动生成的捕捉块
e1.printStackTrace();
}
捕获(IOE1异常)
{
//TODO自动生成的捕捉块
e1.printStackTrace();
}
if(person==null){
生成器=响应
.status(Response.status.NOT_FOUND.getStatusCode());
返回builder.build();
}
试一试{
设备服务更新(dev);
toJSONString(dev);
实体(JSONUtil.toJSONString(dev));
}捕获(JsonGenerationException e){
}捕获(JsonMappingException e){
}捕获(IOE异常){
返回builder.build();
}

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

您需要其他解决方案来在Java中使用json,在Spring中使用Jersey和Jackson,我捕获Java pojo的json对象,请检查此示例

catch对象的代码非常简单

@RequestMapping(method=RequestMethod.POST)
公共Todo saveTodo(@RequestBody Todo Todo){
返回todo.save(todo);
}

我将此作为一个答案发布,因为我还不能发表评论。以下是重构代码的建议,以使其更易于维护。如果不这样做,我建议您发布控制台上打印的StackTrace,以提供进一步的帮助

现在建议: 您应该尝试一下。这将使您的代码更易于管理,并将您从手动执行序列化和反序列化的危险中解放出来。您可以使用所有JAX-B POJO作为参数或返回类型:

@POST
public StatusDTO createStatus(StatusDTO dto) {
    //your code here
}
您只需创建一个POJO并用
@XmlRootElement
对其进行注释,就可以直接将其用作服务中的参数


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

是一个用
@XmlRootElement
注释的POJO示例,并且一些服务正在使用它和
WebApplicationException
@Andres感谢您指导如何使用JAX-B,不幸的是,我不能建议更改当前的解决方案。我必须使用现有的代码和当前的实现。但我确实理解您使用JAX-B的意义。我不明白为什么JSON字符串没有转换为JSON对象。Th谢谢。我理解,但我不允许在很大程度上更改当前代码。我正在使用Jackson将JSON字符串转换为POJO。在发送到java之前,不要将JSON转换为字符串,发送JSON对象,尝试此操作,并检查内容类型,
application/JSON
以获取发送,如果问题仍然存在,我建议创建github用于调试的简单项目