【问题标题】:Spring MVC - Deserialize JSON arraySpring MVC - 反序列化 JSON 数组
【发布时间】:2012-11-19 00:02:56
【问题描述】:

我正在尝试使用 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

所以我的数组中的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. 如果我使用字符串方法,有没有办法将这些乱码转换成我想要的东西?

【问题讨论】:

    标签: javascript json serialization spring-mvc


    【解决方案1】:

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

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

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

    【讨论】:

    • 确实,contentType 做到了!谢谢。我会保持问题开放,以防有人回答我的其他问题。 +1。
    • @Pacane 好吧,你的问题 1 征求意见,对于 2 你需要上面提到的转换器,没有 3 刚刚通过设置内容类型得到解决;)
    猜你喜欢
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 2015-07-11
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多