【问题标题】:.NET JSON Serialization: How to have a DataContract as a member of another DataContract.NET JSON 序列化:如何将 DataContract 作为另一个 DataContract 的成员
【发布时间】:2012-04-23 04:37:55
【问题描述】:

我正在尝试序列化一个包含另一个数据协定对象作为参数的 .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 的已知类型列表中。"}"

我不知道如何执行该例外中给出的任何建议。

  1. 如何添加到 KnownTypes 列表中?
  2. 如何使用 KnownTypeAttribute ?

【问题讨论】:

    标签: .net json serialization


    【解决方案1】:

    好的,知道怎么做。我不想删除这个问题以防其他人发现它有用,所以这里是解决方案......

    [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; }
        }
    

    注意到JsonObject2 类声明上方的[KnownType(typeof(JsonObject2))] 了吗?这样就解决了。

    【讨论】:

      猜你喜欢
      • 2020-03-09
      • 2016-03-22
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      相关资源
      最近更新 更多