【问题标题】:Unable to deserialize array无法反序列化数组
【发布时间】:2012-03-07 13:39:06
【问题描述】:

从客户端发送的数据不会被反序列化。

客户:

$.ajax({
     type: 'POST',
     dataType: "json",
     url: 'savecommentsservice',
     data: { "Pid": 0, "Comments": [{ "User": "bbbbbb", "Text": "aaaaaaaa" }, { "User": "ddddddd", "Text": "ccccccccc"}] },

DTO:

public class Comment
{
    public string User { get; set; }
    public string Text { get; set; }
}
public class SaveCommentsRequest
{
    public int Pid { get; set; }
    public string SiteId { get; set; }
    public string Column { get; set; }
    public List<Comment> Comments { get; set; }
}

服务器:

Routes.Add<SaveCommentsRequest>("/savecommentsservice");

...

public object Execute(SaveCommentsRequest request)
    {
        // Why is request.Comments null !!! All other params of the request works fine

        // THe string I'm putting in is generated below - just to make sure its correct
        request.Comments = new List<Comment>();
        request.Comments.Add(new Comment { Text = "aaaaaaaa", User = "bbbbbb" });
        request.Comments.Add(new Comment { Text = "ccccccccc", User = "ddddddd" });

        var thisIsWhatIPutInto$AjaxCall = JsonSerializer.SerializeToString<SaveCommentsRequest>(request);

知道有什么问题吗?为什么没有填充 Comments 数组。从 cmets 中可以看出,我使用 servicestack json 序列化程序生成了字符串。

也许我在这里遗漏了一些明显的东西?

编辑 在查看 fiddler 传输的内容时,我看到了这个:

    POST http://localhost:4920/savecommentsservice HTTP/1.1
Host: localhost:4920
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://localhost:4920/default.cshtml?viewId=3
Content-Length: 227
Cookie: ASP.NET_SessionId=slbw453revfgmwuuxyrim1an
Pragma: no-cache
Cache-Control: no-cache

SiteId=Site1&Pid=0&Column=C6&Comments%5B0%5D%5BUser%5D=bbbbbb&Comments%5B0%5D%5BText%5D=aaaaaaaa&Comments%5B1%5D%5BUser%5D=ddddddd&Comments%5B1%5D%5BText%5D=ccccccccc&Comments%5B2%5D%5BUser%5D=ggggggg&Comments%5B2%5D%5BText%5D=

在萤火虫中:

    Parametersapplication/x-www-form-urlencoded
Column  C6
Comments[0][Text]   aaaaaaaa
Comments[0][User]   bbbbbb
Comments[1][Text]   ccccccccc
Comments[1][User]   ddddddd
Comments[2][Text]   
Comments[2][User]   ggggggg
Pid 0
SiteId  SiteId0
Source
SiteId=SiteId0&Pid=0&Column=C6&Comments%5B0%5D%5BUser%5D=bbbbbb&Comments%5B0%5D%5BText%5D=aaaaaaaa&Comments%5B1%5D%5BUser%5D=ddddddd&Comments%5B1%5D%5BText%5D=ccccccccc&Comments%5B2%5D%5BUser%5D=ggggggg&Comments%5B2%5D%5BText%5D=

问候

拉西

【问题讨论】:

    标签: c# json servicestack


    【解决方案1】:

    您可以看到,默认情况下,jQuery 的 Ajax 将其提交为“application/x-www-form-urlencoded”,这是默认的 HTML 表单发布内容类型。不幸的是,它不能很好地处理嵌套对象,ServiceStack 会期望 JSV Format 中的嵌套对象。

    因此,对于复杂类型/嵌套对象,您想告诉 jQuery 以 JSON 格式发送请求,您可以通过指定 contentType:application/json 参数来执行此操作,例如:

    var data = { "Pid": 0, "Comments": [{ "User": "bbbbbb", "Text": "aaaaaaaa" }]};
    $.ajax({
         type: 'POST',
         dataType: "json",
         contentType: "application/json",
         url: 'savecommentsservice',
         data: JSON.stringify(data)
    );
    

    【讨论】:

    • 嗨!首先,感谢一个伟大的框架。抱歉迟了回应。将 contentType 设置为 application/json 给了我一个例外:“类型定义应该以'{'开头,期望序列化类型'SaveCommentsRequest',字符串开头:Pid=0&Comments%5B0 ...”我应该在服务中更改的任何内容?
    • 嗨,刚刚意识到 data 需要使用JSON.stringify() 序列化为 JSON,因为 jQuery 不会自动为您执行此操作并将其发送到 application/ x-www-form-urlencoded 默认情况下为 ContentType,即使您指定 JSON contentType。无论如何修改答案。
    【解决方案2】:

    我相信您需要将参数(请求)的名称添加到您的字符串中。 类似的东西..

    $.ajax({
         type: 'POST',
         dataType: "json",
         url: 'savecommentsservice',
         data: {"request": "Pid": 0, "Comments": [{ "User": "bbbbbb", "Text": "aaaaaaaa" }, { "User": "ddddddd", "Text": "ccccccccc"}] },
    

    【讨论】:

    • 嗨!感谢您查看这个。但是不,当添加参数名时,没有任何东西被反序列化。所有顶级都正确反序列化,只有空数组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多