. getjson调用不能处理使用继承的对象

本文关键字:继承 对象 调用 不能 处理 getjson | 更新日期: 2023-09-27 18:08:32

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

[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 . json)序列化它时,它工作得很好。svc/coolstuff/' + id, loadCoolStuff);

问题是,当我使我的字段类继承另一个类时,. 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失败?我被困在这里了。非常感谢!

. getjson调用不能处理使用继承的对象

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

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

本文提供了一些直接的示例。

对于您提供的示例,您需要这样修饰FieldBase定义:
[DataContract]
[KnownType(typeof(Field))]
public class FieldBase
{
}

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