C# Asp.NET WebMethod中的空JSON.NET JObject

C# Asp.NET WebMethod中的空JSON.NET JObject,c#,asp.net,ajax,web-services,json.net,C#,Asp.net,Ajax,Web Services,Json.net,我很难从Asp.NET WebMethod(没有MVC或Web.API)返回JSON.NETJObject 我不想使用字符串而不是JObject,我需要使用匿名对象,这样我就无法将它映射到已知类 这是代码的精简版本: Asp.net WebMethod: [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ScriptService] public class DataRoomService : WebServiceBas

我很难从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:[[]]、[[]]、[[]]、[[]]、[[[]]]}”
问题是ASMX web服务在内部使用,它不知道如何序列化
作业对象。但是您根本不需要在这里使用
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")

我认为这是由于这一点,我希望它可以被取代。谢谢你的回复。无论如何,我想我会切换到web.api,因为我需要验证和保存一个匿名对象,我需要
JObject
的功能。是的,如果可以的话,我绝对建议切换到web api。ASMX现在已经过时了,扩展性不强,例如,据我所知,它没有一种简单的方法来替换序列化程序。