我正在努力从Asp.net WebMethod(没有MVC或Web.API)返回JSON.NET JObject
。
我不想使用字符串而不是JObject
,我需要使用匿名对象,因此我无法将其映射到知道类。
这是代码的精简版本:
Asp.net WebMethod:
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class DataRoomService : WebServiceBase
{
[WebMethod(EnableSession = true)]
[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json, XmlSerializeString = false)]
public JObject Load(int id)
{
var rtn = new
{
Gender = true,
Age = 56,
Weigth = 102.4,
Date = DateTime.Now.AddDays(-7)
};
return JObject.FromObject(rtn);
}
jQuery ajax请求:
$.ajax({
type: 'POST',
contentType: 'application/json; charset=utf-8',
url: url,
data: input === '' ? '{}' : input,
async: useasync,
success: function (data) {
...
}, ...
结果:"{"d":[[[]],[[]],[[]],[[]]]}"
答案 0 :(得分:2)
问题是ASMX Web服务在内部使用JavaScriptSerializer
,它不知道如何序列化JObject
。但是你根本不需要在这里使用JObject
- 只需将你的web方法改为返回object
并直接返回匿名对象:
public object Load(int id)
{
var rtn = new
{
Gender = true,
Age = 56,
Weight = 102.4,
Date = DateTime.Now.AddDays(-7)
};
return rtn;
}
请注意,JavaScriptSerializer
以Microsoft格式("\/Date(1497023008910)\/"
)而不是ISO 8601("2017-06-16T15:56:05Z"
)序列化日期。如果您需要ISO 8601,您需要确保在返回之前在匿名对象中手动格式化日期:
Date = DateTime.UtcNow.AddDays(-7).ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK")