错误反序列化类型的对象....结束元素'......'从命名空间''预期。从命名空间''找到元素'item'

时间:2013-04-05 19:37:20

标签: c# json datacontractjsonserializer

当我反序列化我的jsonstring时,我收到错误消息

 There was an error deserializing the object of type RecordInfo. End element 'Warning' from namespace '' expected. Found element 'item' from namespace ''.

这是我的JsonString

public const string jsonString = @" 
        {
            ""RequestId"":514106,
            ""Warning"":[],
            ""CustomerData"": {
                ""Email"":""abc@abc.com"",
                ""FullName"":""OrTguOfE"",
                ""OrderData"":[]
            }
        }";

数据合同

[DataContract]
    public class RecordInfo
    {
        [DataMember(Name = "RequestId")]
        public string RequestId { get; set; }

        [DataMember(Name = "Warning")]
        public string Warning { get; set; }

        [DataMember(Name = "CustomerData")]
        public CustomerData CustomerData { get; set; }
    }
 [DataContract]
    public class CustomerData
    {
        [DataMember(Name = "Email")]
        public string RequestId { get; set; }

        [DataMember(Name = "FullName")]
        public string FullName  { get; set; }

        [DataMember(Name = "OrderData")]
        public OrderData[]  OrderData { get; set; }
    }
[DataContract]
    public class OrderData
    {
        [DataMember(Name = "OrderId")]
        public string OrderId { get; set; }

        [DataMember(Name = "SourceId")]
        public string SourceId { get; set; }

        [DataMember(Name = "SourceData")]
        public SourceData[] SourceData { get; set; }
    }

    [DataContract]
    public class SourceData
    {
        [DataMember(Name = "SourceDescription")]
        public string SourceDescription { get; set; }

        [DataMember(Name = "ProductName")]
        public string ProductName { get; set; }
    }
}

这是我使用的解串器

private static T Deserialize<T>(string jsonString)
    {
        using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString)))
        {
            var serializer = new DataContractJsonSerializer(typeof(T));
            return (T)serializer.ReadObject(ms);
        }
    }

当我反序列化bove jsonstring时,我收到错误消息

 There was an error deserializing the object of type RecordInfo. End element 'Warning' from namespace '' expected. Found element 'item' from namespace ''.

有任何解决此错误的建议吗?

2 个答案:

答案 0 :(得分:5)

设置IsRequired = false,例如:

[DataMember(Name = "RequestId", IsRequired = false)]

MSDN来源DataMemberAttribute.IsRequired Property

  

获取或设置一个值,该值指示序列化引擎   成员必须在阅读或反序列化时在场。

答案 1 :(得分:2)

我发现类似错误的另一个原因是我们将数组类型的Json字段映射到数据协定类的非数组字段。 (例如)我的JSON数据就像 -

"ipAddress": [
    "10.61.255.25",
    "fe80:0000:0000:0000:10e1:0b66:96a6:9ac8"
]

但是因为我不知道这种IPAddress数据,所以我将ipaddress映射到

[DataMember(Name="ipAddress")]
public string IPAddress ( get; set; }

相反,它应该是

[DataMember(Name="ipAddress")]
public string[] IPAddress ( get; set; }