C# .getJson调用不处理使用继承的对象

C# .getJson调用不处理使用继承的对象,c#,jquery,json,inheritance,serialization,C#,Jquery,Json,Inheritance,Serialization,第一个帖子。。。通常我能够搜索并找到问题的答案,但这次我不能。我有一个使用了一堆其他对象的对象: [DataContract] public class CoolStuff { [DataMember] public Field[] CoolField { get; set; } public CoolStuff() { CoolField = SetCoolField(); } private Field[] SetCoolF

第一个帖子。。。通常我能够搜索并找到问题的答案,但这次我不能。我有一个使用了一堆其他对象的对象:

[DataContract]
public class CoolStuff
{
    [DataMember]
    public Field[] CoolField { get; set; }

    public CoolStuff()
    {
        CoolField = SetCoolField();
    }

    private Field[] SetCoolField()
    {
        return new Field[]
        {
            new Field("Project Information", "ProjectInformation"),
            new Field("Resource Information", "ResourceInformation"),
        }
     }
}

[DataContract]
public class Field
{
    [DataMember]
    public string Prompt { get; set; }
    [DataMember]
    public string Value { get; set; }
    [DataMember]
    public bool IsLocked { get; set; }

    public Field(string prompt, string value = "n/a", bool isLocked = false)
    {
        Prompt = prompt;
        Value = value;
        IsLocked = isLocked;
    }
}
我从一个服务中调用我的构造函数,当我尝试用$.getJSON(/service.svc/coolstuff/'+id,loadCoolStuff)序列化它时,它工作得很好

问题是,当我让我的Field类从另一个类继承时,.getJson调用失败,但没有给出原因

[DataContract]
public class CoolStuff
{
    [DataMember]
    public FieldBase[] CoolField { get; set; }

    public CoolStuff()
    {
        CoolField = SetCoolField();
    }

    private FieldBase[] SetCoolField()
    {
        return new FieldBase[]
        {
            new Field("Project Information", "ProjectInformation"),
            new Field("Resource Information", "ResourceInformation"),
        }
    }
}

[DataContract]
public class FieldBase
{

}

[DataContract]
public class Field : FieldBase
{
    [DataMember]
    public string Prompt { get; set; }
    [DataMember]
    public string Value { get; set; }
    [DataMember]
    public bool IsLocked { get; set; }

    public Field(string prompt, string value = "n/a", bool isLocked = false)
    {
        Prompt = prompt;
        Value = value;
        IsLocked = isLocked;
    }
}

有人能解释一下为什么使用^this代码,我对.getJSON的调用失败了吗?我真的被困在这里了。非常感谢

好的,从我推断的字里行间可以看出,您正在使用WCF进行此web服务。使用
DataContract
属性和以.svc结尾的url就足够清楚了。这是相关的,因为这个问题对于WCF序列化的方式来说是特殊的。正如我在上面的评论中提到的,在使用默认Newtonsoft JSON序列化程序的ASP.NET Web API中,相同的类结构没有问题

这里需要的是
KnownType
属性来正确定义用于序列化的派生类型

提供了一些直接的例子。有一个更详细的概念

对于您提供的示例,您需要像这样装饰FieldBase定义:

[DataContract]
[KnownType(typeof(Field))]
public class FieldBase
{
}

请注意,这将在JSON中添加一个额外的字段,如
“\uuuu type”:“field:#MyTestWebProject”
。你可以忽略这一点,如果它困扰着你,你可以去寻找摆脱它的方法。但我不能保证这是可能的。

您使用的是什么json序列化程序?ASP.NET MVC的默认设置?ASP.NET WebApi默认值?Newtonsoft?对不起,我想我使用的是asp.net默认版本。我对序列化一无所知,我从其他人那里继承了这个项目。你应该看看正在传输的数据。尝试将您的浏览器导航到
/Service.svc/coolstuff/'+id
地址,然后查看您得到的结果。谢谢,我已经尝试过了,但我得到了错误:加载资源失败,未收到数据错误324(net::ERR_EMPTY_RESPONSE):服务器在未发送任何数据的情况下关闭了连接。但是如果我去掉继承,它就可以正常工作了。代码中缺少了一些右大括号(})。除此之外,
SetCoolField
方法在这两个示例中实际上都无法完成任何事情。它返回一个数组,但该数组从未分配给变量<代码>冷却场从未分配。通过将调用更改为
CoolField=SetCoolField()
,这两个示例在ASP.NET Web API中使用默认的(Newtonsoft)JSON序列化程序都可以很好地工作。这实际上不是您所描述的问题,因为它在没有继承的情况下工作,但在没有继承的情况下工作。也许你需要改进你提供的样品?