0

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

[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;
    }
}

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

4

1 回答 1

0

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

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

本文提供了一些简单明了的示例。这个有更多关于概念的细节。

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

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

请注意,这将为您的 JSON 添加一个额外的字段,例如"__type":"Field:#MyTestWebProject". 你可以忽略它,或者如果它困扰你,就去寻找摆脱它的方法。我不保证这是可能的。

于 2013-04-10T22:37:18.530 回答