我有一个用例,我使用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”,因此这种方法不起作用。
结论 在我最初的评估中,我指的是一个对象和数组组合。我想问题是获得一个简单的子对象来序列化/反序列化。这是否意味着不支持该概念,或者我是否错误地传递了该对象?
答案 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'解决了问题,现在所有数据都在服务器上正确反序列化。