Spring MVC - 反序列化JSON数组

时间:2012-11-19 00:02:57

标签: javascript json serialization spring-mvc

我正在尝试使用Ajax和JSON将数据传递给我的控制器。

我有一个HTML表格,我必须将该表的多个坐标发送到我的控制器。所以我创建了一个包含这种匿名对象的Javascript数组:

{ 
    DAY: someIndex, 
    HOUR: someOtherIndex 
}

并让这个数组被称为coordinates,我将它序列化为:

JSON.stringify(coordinates)

然后在ajax调用(type: POST)中我使用了data: JSON.stringify(coordinates)

在我准备好的文件中,我使用了:

$.ajaxSetup({
    headers : {
        Accept : "application/json; charset=utf-8"
    }
}); 

我的控制器看起来像这样:

@RequestMapping(value = "/{id}", method = RequestMethod.POST)
public @ResponseBody
String update(@PathVariable int id, @RequestBody String coordinates, HttpServletResponse response) {

    // Do something here to convert it in my complex structure

}

但是我不知道参数coordinates的类型应该是什么。

我正在使用GSON。我无法轻易地将其反序列化。我尝试使用this解决方案,但它不起作用。 (由于某种原因,保持要求投射类型。)

由于我认为没有可能正确地反序列化,我试图将坐标序列化为另一种格式(只是一个字符串的JSON数组,其中坐标被一个标记分开(;) here < / p>

所以我的数组javascript对象是在foreach

中创建的
coordinates.push( someIndex.toString() + ";" + someOtherIndex.toString() );

我保留了字符串部分。

所以现在当我POST数据到我的控制器时,我用System.out.println(coordinates)输出值,输出看起来很奇怪。

%5B%220%3B8%22%5D=

在Javascript控制台中为此对象:["0;8"]

所以我的问题:

  1. 这是一个好方法吗?
  2. 是否可以将JSON数组反序列化为某些java类型?比如List<Coordinate>? (我尝试在我的控制器中使用此类型而不是String,但它会给我一个错误415 - Unsupported media type
  3. 如果我正在使用String方法,有没有办法将这些乱码翻译成我想要的东西?

1 个答案:

答案 0 :(得分:1)

您在服务器端获得%5B%220%3B8%22%5D=,因为默认情况下jQuery将数据序列化为查询字符串。

您需要使用application/json jQuery选项将请求的内容类型设置为contentType

然后你可能想看一下GsonHttpMessageConverter的一些实现,以便进行更简单的RequestBody转换。这是one,看起来spring for android中有一个,所以也许你可以使用它。