首页 文章

.NET JSON序列化:如何将DataContract作为另一个DataContract的成员

提问于
浏览
0

我试图序列化.net对象包含另一个数据协定对象作为参数 . 代码如下......

[DataContract]
        public class JsonObject2
        {
            [DataMember(Name = "field1")]
            string field1 { get; set; }
            [DataMember(Name = "field2")]
            string field2 { get; set; }
            [DataMember(Name = "field3")]
            object[][] test = { new object[]{"key1", "value1"}, new object[]{"key2", "value2"}, new object[]{"key3", "value3"} };
        }

        [DataContract]
        public class JsonObject3
        {
            [DataMember(Name = "field1")]
            public string field1 { get; set; }
            [DataMember(Name = "field2")]
            public object field2 { get; set; }
        }

DataContractJsonSerializer dcjs2 = new DataContractJsonSerializer(typeof(JsonObject3));

                JsonObject3 obj3 = new JsonObject3();
                obj3.field1 = "hello";
                obj3.field2 = new JsonObject2();
                dcjs2.WriteObject(s, obj3);
                s.Position = 0;
                MessageBox.Show(new StreamReader(s).ReadToEnd());

执行上述操作会导致以下异常...

“{”键入'JSONParser.Form1 JsonObject2',数据协定名称为“Form1.JsonObject2:http://schemas.datacontract.org/2004/07/JSONParser”,不是预期的 . 将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中 . “}”

我无法弄清楚如何执行该例外中给出的任何建议 .

  • 如何添加到KnownTypes列表?

  • 如何使用KnownTypeAttribute?

1 回答

  • 0

    好的,想通了怎么做 . 我不想删除这个问题以防其他人觉得它有用,所以这里有解决方案......

    [DataContract]
        [KnownType(typeof(JsonObject2))]
        public class JsonObject2
        {
            [DataMember(Name = "field1")]
            string field1 { get; set; }
            [DataMember(Name = "field2")]
            string field2 { get; set; }
            [DataMember(Name = "field3")]
            object[][] test = { new object[]{"key1", "value1"}, new object[]{"key2", "value2"}, new object[]{"key3", "value3"} };
        }
    
        [DataContract]
        public class JsonObject3
        {
            [DataMember(Name = "field1")]
            public string field1 { get; set; }    
            [DataMember(Name = "field2")]
            public object field2 { get; set; }
        }
    

    注意 [KnownType(typeof(JsonObject2))] 在JsonObject2类的声明之上?这解决了它 .

相关问题