调试ServiceStack POST请求反序列化

时间:2013-04-11 17:50:24

标签: javascript jquery json servicestack

我有一个用例,我使用jQuery发布一个带有数组成员的复杂对象。 E.g:

data: {
   obj1: obj1,
   arr1: [ ... ]
}

在服务器上,我实现了ServiceStack服务。服务器上的自动请求映射为请求成员生成空值,但如果我提取Request.GetRawBody(),然后使用ServiceStack.Text.JsonSerializer.DeserializeFromString,我得到了我需要的东西。

调试实际的反序列化并查看缺少的内容会很有用。有谁知道怎么做?

示例:

传递平面物体 使用几个字段定义一个简单的请求对象:

public class Request
{
  public string Name { get; set; }
}

进行jQuery ajax调用:

$.ajax({
  //...
  data: {
    name: 'John Doe'
  }
});

调用有效,服务器接收带有“John Doe”名称属性的对象。

传递具有子对象的对象

public class Request
{
  public Caller Caller { get; set; }
}

public class Caller
{
  public string Name { get; set; }
}

然后从jQuery调用:

$.ajax({
  // ...
  data: {
    caller: {
      name: 'John Doe'
    }
  }
});

在调用之后,服务请求的“调用者”属性为“null”,因此这种方法不起作用。

结论 在我最初的评估中,我指的是一个对象和数组组合。我想问题是获得一个简单的子对象来序列化/反序列化。这是否意味着不支持该概念,或者我是否错误地传递了该对象?

2 个答案:

答案 0 :(得分:1)

如果您认为实际的反序列化确实存在问题,那么我建议从github下载源代码并尝试创建失败的单元测试。如果你认为它与json反序列化,那么下载ServiceStack.Text项目。否则,您应该下载主ServiceStack项目。阅读现有的单元测试对于整个项目的工作方式非常有用。

然而,可能是无效的json符号。通过比较序列化DTO的结果与实际传入ajax调用的结果,对json进行逆向工程通常很有用。

更新:您的json应如下所示:

{"Caller":{"Name":"John Doe"}}

检查此问题的简便方法是执行以下操作:

var r = new MyRequest() {Caller = new Caller() {Name = "John Doe"}};
var json = r.ToJson();

答案 1 :(得分:1)

我已经找到了问题,希望答案可以帮助别人。事实证明,$ .ajax正在将内容类型发送为表单url编码(这在jQuery文档中清楚地记录,我刚刚错过了它): http://api.jquery.com/jQuery.ajax/

将contentType设置为'application / json'解决了问题,现在所有数据都在服务器上正确反序列化。