【问题标题】:json string can't be posted as plain string through jquery ajax?json字符串不能通过jquery ajax作为纯字符串发布?
【发布时间】:2012-05-31 06:55:34
【问题描述】:

我想将一个json字符串作为纯字符串发布到一个动作中,然后使用gson将该字符串转换为List,但该字符串仍被jquery/webwork视为json对象,我使用的是jquery 1.43+webwork+gson ,没有jquery json插件什么的。

这里是行动:

public class ImageAction extends BaseAction {

    private String pks;

    public void setPks(String pks) {
        this.pks = pks;
        Gson gson=new Gson();
        List<Map> list=gson.fromJson(pks,new TypeToken<List<Map<String,String>>>(){}.getType());
        System.out.println(list.size());
    }

    ......
}

jquery 代码:

j$.ajax({
            url:approveUrl,
            data: {pks:'[{"userName":"theoffspring"}]'},
//            dataType:'json',
            type:'post',
//            traditional: true,
            success:function (response) {
                hideProgressBar(parent.document)
                if (response.result==false){
                    alert(response.msg);
                    return;
                }

//                document.location.reload();
            }

        })

我希望将 pks 作为通用字符串而不是 json 对象发布。但是当我调用 jquery 代码时,结果并没有调用 setPks 方法。好奇怪。

【问题讨论】:

    标签: java gson webwork


    【解决方案1】:

    您还没有序列化您通过 ajax 发送的数据。在客户端使用 JSON.stringify() 对其进行序列化,并将其发送到单个字符串。

    将您的代码修改为:

    $.ajax({
                url:approveUrl,
                data:JSON.stringify(yourdata),
    //            dataType:'json',
                type:'post',
    //            traditional: true,
                success:function (response) {
                    hideProgressBar(parent.document)
                    if (response.result==false){
                        alert(response.msg);
                        return;
                    }
    
    //                document.location.reload();
                }
    
            })
    

    这可能行得通。

    【讨论】:

    • 奇怪,我先用了,还是不行,重启电脑后就可以了,好像是ie缓存的问题。如果还是不行,可以下载json2.js应该可以。但是您还需要使用 gson 将 json 字符串转换为您喜欢的任何类型。
    【解决方案2】:

    看看这个:http://jsfiddle.net/flocsy/vuGL9/

    你会看到你的 pks 实际上是作为你想要的字符串发送的,当它不是作为字符串 (pks2) 发送时,它看起来会有所不同。

    PS:查看 firebug 或检查元素中的网络选项卡,具体取决于您的浏览器:

    pks: '[{"userName":"theoffspring"}]'
    

    pks2[0][userName2]:'hehe'
    

    所以可能你的服务器端做了一些魔术......

    【讨论】:

    • 是的,我猜服务器端必须把它当作 josn 对象,而不是普通的字符串,但是有什么解决办法呢?
    • 我不知道这个BaseAction是什么,但是为什么你认为应该自动调用setPks呢?
    猜你喜欢
    • 2015-10-07
    • 2017-05-05
    • 2016-02-17
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多