Angularjs 将JSON字符串转换为JSON对象
我使用AJAX向RESTful web服务发出以下PUT请求。在发出请求之前,我将表单提交(使用ng submit)返回的数据转换为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,
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用于调试的简单项目