0

我正在尝试使用 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. 而且我无法轻松反序列化它。我尝试使用解决方案,但它不起作用。(出于某种原因一直要求转换类型。)

由于我认为不可能正确反序列化,因此我尝试将坐标序列化为另一种格式(只是一个 JSON 字符串数组,其中坐标由令牌分割(;) here

所以我的数组中的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 方法,有没有办法将这些乱码翻译成我想要的东西?
4

1 回答 1

1

%5B%220%3B8%22%5D=在服务器端,导致 jQuery 默认将数据序列化为查询字符串。

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

然后你可能想看看 GsonHttpMessageConverter 的一些实现,以便更简单的 RequestBody 转换。这是一个,看起来春天有一个适用于 android,所以也许你可以使用它。

于 2012-11-19T00:25:43.790 回答