基本上,我们现在正试图找出一种使用C#WCF生成json的方法。
[{Test1Class},{Test2Class}]
我已尝试过以下
[DataContract]
public class TestBaseClass
{
[DataMember]
public string baseproperty { get; set; }
}
[DataContract]
public class Test1Class:TestBaseClass
{
[DataMember]
public string test1property { get; set; }
}
[DataContract]
public class Test2Class:TestBaseClass
{
[DataMember]
public string test2property { get; set; }
}
//testing returns
[WebInvoke(Method = "GET", UriTemplate = "history/testtest", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public List<TestBaseClass> ddd()
{
List<TestBaseClass> result = new List<TestBaseClass>();
result.Add(new Test1Class());
result.Add(new Test2Class());
return result;
}
它不起作用,没有任何回报。没有错误没有。
答案 0 :(得分:0)
WCF&#39; data contract serializers要求事先声明对象图中遇到的所有类型。最常见的是,这通过类型的数据协定元数据进行,该元数据枚举了要序列化的属性的类型和名称。当需要多态时,就像在类层次结构中一样,您需要使用KnownTypeAttribute
声明预期的子类型:
public class CdiUtils {
private static BeanManager beanManager;
@SuppressWarnings("unchecked")
public static <T> T getBean(Class<T> beanClass) throws NamingException {
Bean<T> bean = (Bean<T>) getBeanManager().getBeans(beanClass).iterator().next();
CreationalContext<T> ctx = getBeanManager().createCreationalContext(bean);
return (T) getBeanManager().getReference(bean, beanClass, ctx);
}
private static BeanManager getBeanManager() throws NamingException {
if (beanManager == null) {
InitialContext context = new InitialContext();
beanManager = (BeanManager) context.lookup("java:comp/BeanManager");
}
return beanManager;
}
}
或将已知类型列表传递给data contract serializer:
[DataContract]
[KnownType(typeof(Test1Class))]
[KnownType(typeof(Test2Class))]
public class TestBaseClass
{
[DataMember]
public string baseproperty { get; set; }
}
完成此操作后,WCF的var serializer = new DataContractJsonSerializer(typeof(List<TestBaseClass>), new[] { typeof(Test1Class), typeof(Test2Class) });
将为您的列表生成JSON,type hints表示序列化的实际类型:
DataContractJsonSerializer