从Asp.net WebMethod清空JSON.NET JObject

时间:2017-06-16 13:48:21

标签: c# asp.net ajax web-services json.net

我正在努力从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":[[[]],[[]],[[]],[[]]]}"

1 个答案:

答案 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")