如何将不同类的对象包含在c#wcf的列表中并将它们作为json返回?

时间:2015-11-06 14:32:48

标签: c# json wcf serialization

基本上,我们现在正试图找出一种使用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;
    }

它不起作用,没有任何回报。没有错误没有。

1 个答案:

答案 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