1

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

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”,所以这种做法是行不通的。

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

4

2 回答 2

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();
于 2013-04-11T20:50:52.963 回答
1

我已经弄清楚了这个问题,希望答案对其他人有所帮助。事实证明,$.ajax 将内容类型作为 url 编码的表单发送(在 jQuery 文档中明确记录,我刚刚错过了): http ://api.jquery.com/jQuery.ajax/

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

于 2013-08-21T21:18:02.833 回答