反序列化类型对象出错......来自命名空间''的结束元素''预期。在命名空间''中找到了''item''元素。

8
当我反序列化我的json字符串时,我收到了错误消息。
 There was an error deserializing the object of type RecordInfo. End element 'Warning' from namespace '' expected. Found element 'item' from namespace ''.

这是我的Json字符串。
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);
        }
    }

当我反序列化上面的json字符串时,出现错误信息。
 There was an error deserializing the object of type RecordInfo. End element 'Warning' from namespace '' expected. Found element 'item' from namespace ''.

有什么建议可以解决这个错误吗?

你想将哪些“DataMember”设置为可空? - MethodMan
@Wiemon,“Warning”应该映射到什么? - Justin
2个回答

6

IsRequired = false,例如:

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

MSDN资料源: DataMemberAttribute.IsRequired属性

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


1
我的代码在反序列化过程中出现了错误信息。期望命名空间''的结束元素'Warning',但发现了来自命名空间''的元素'item'。 - Steve
2
你的问题出在其他地方:你将 Warning 属性声明为 string,但是你的 JSON 包含一个对象:""Warning"":[] - MarcinJuraszek
如果出现“Warning:[“WARNING_no data ForCustomer”]”的情况,那么我的警告对象应该是什么样子?如果我创建一个数据合同,如下所示: [DataContract(Name = "Warning")] public class Warning { [DataMember(Name = "Message", IsRequired = false)] public string Message { get; set; } } 它不会返回消息。 - Steve
2
将您的“Warning”属性定义更改为“string []”:public string [] Warning {get; set;} - MarcinJuraszek
对于我的代码,我遇到了以下错误:{"反序列化对象类型 System.String 时出错。期望来自命名空间 '' 的元素 'root'。但找到了来自命名空间 '' 的元素 'menu'。"}如何解决这个问题? - Rocky Balboa

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接