. 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失败?我被困在这里了。非常感谢!
好的,从字里行间我推断出您正在为这个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"
。你可以忽略它,或者去寻找摆脱它的方法,如果它困扰你。但我不能保证这是可能的。