查询字符串中扁平化 JSON 对象的 Struts2 类型转换

Posted

技术标签:

【中文标题】查询字符串中扁平化 JSON 对象的 Struts2 类型转换【英文标题】:Struts2 type conversion of a flattened JSON object in a query string 【发布时间】:2012-07-28 18:12:08 【问题描述】:

编辑:更改了问题的标题和内容。在阅读JSON plugin guide 后,我意识到插件可能需要一个 JSON 字符串而不是这个查询映射,在这种情况下,我通常会使用 GSON。我想问题变成了:Struts2 如何处理这样的查询字符串的类型转换:sort[0][field]=status&sort[0][dir]=asc


我正在使用 Kendo UI 网格与我的 Struts2 后端进行交互。发送到服务器的 AJAX 请求遵循以下格式(GET 查询字符串):

take=5&skip=0&page=1&pageSize=5&sort%5B0%5D%5Bfield%5D=status&sort%5B0%5D%5Bdir%5D=asc

或(非转义):

take=5&skip=0&page=1&pageSize=5&sort[0][field]=status&sort[0][dir]=asc

基本上,Kendo UI 网格正在向服务器发送一个扁平化的 JSON 对象。所以我创建了一个这样的排序模型对象来获取输入:

public class SortModel 
    private String field;
    private String dir;

并将其作为要填充的变量包含在我的 Struts2 操作中:

private SortModel[] sort;

但是,当 AJAX 请求进入时,Struts2 永远不会填充它。我还尝试添加 JSON 拦截器,但我认为我误解了它的反序列化过程,如编辑中所述。

无论如何,有没有人设法使用上述查询字符串或类似的查询字符串进行 Struts2 类型转换:sort[0][field]=status&sort[0][dir]=asc

【问题讨论】:

【参考方案1】:

排序[0][字段]=状态&排序[0][目录]=asc

以上不是正确的 JSON,字符串应该被引用。完成后,以下内容将起作用。

在这种情况下,name[i]['s'] 形式的字段(或 json 参数)的值为 String,其中 i 是整数,s 是任何字符串,将由以下内容支持:

private List<Map<String, String>> name = new ArrayList<Map<String, String>>();

//getter AND setter required

PS:使用 Struts2,您可以对列表列表进行索引...没有问题。

【讨论】:

【参考方案2】:

好的。

事实证明 vanilla Struts2 不接受 obj[idx][property] 格式的查询字符串(请随时纠正我)。我期待它将查询字符串转换为该特定对象的数组。

Struts2 接受的是obj[idx].property 格式,它将正确转换为private Object[] obj

所以我想可能的解决方案是:

    JSON.stringify(jsonObj) 在将其传递给查询字符串之前,例如 &amp;jsonData=[property:'value'] - 在这种情况下,我不能这样做,因为 Kendo UI 网格似乎没有类似拦截器事件让我更改查询参数。或者,

    实现处理这种特定格式的自定义类型转换器。或者,

    在 AJAX 请求被发送到服务器之前拦截它并重新格式化查询字符串,使用 jQuery.ajaxSend 例如

    $(body).ajaxSend(function(event, req, settings)
        console.log(settings.url); //contains the url string to replace
        settings.url = settings.url.replace(some_regex, 'correct format');
    );
    

【讨论】:

Quaternion 的回答澄清了我关于接受格式的问题。 param[0][string] 无效,但 param[0]['string'] 是有效的 JSON,并且可以被 Struts2 转换。

以上是关于查询字符串中扁平化 JSON 对象的 Struts2 类型转换的主要内容,如果未能解决你的问题,请参考以下文章

Extjs - 在属性网格中显示嵌套对象

Struts2:Json插件_Ajax

关于ES6的flat(扁平化数组)

C#扁平化json结构

Javascript中扁平化数据结构与JSON树形结构转换详解

RestKit 0.20:在 JSON 中使用动态扁平化层次结构