2013-04-05 45 views
4

当我反序列化我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"":""[email protected]"", 
       ""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); 
     } 
    } 

当我反序列化波夫jsonstring,我收到错误消息

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

任何建议,以解决这个问题?

+0

哪个'DataMember''你想成为'Nullable' – MethodMan 2013-04-05 19:39:32

+0

@Wiemon什么是“警告”假设映射到? – Justin 2013-04-05 20:00:04

回答

5

IsRequired = false,例如:

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

MSDN源DataMemberAttribute.IsRequired Property

获取或设置用于指示所述序列化引擎,读取或反串行化时 构件必须存在的值。

+0

对于我的代码,我在反序列化过程中收到错误消息反序列化RecordInfo类型的对象时出现错误。从命名空间''预期结束元素'警告'。从命名空间''找到元素'item'。 – Steve 2013-04-05 19:53:06

+0

您的问题在其他地方:您已将'Warning'属性声明为'string',但您的JSON包含一个对象:'“”Warning“”:[]'。 – MarcinJuraszek 2013-04-05 19:58:27

+0

如果出现“警告”:[“WARNING_no data ForCustomer”]如果我创建像[DataContract(Name =“Warning”)] [DataContract(Name =“Warning”)]的数据合同,我的警告对象应该是什么样子public class Warning [DataMember Name =“Message”,IsRequired = false)] public string Message {get;组; } },它不会返回消息 – Steve 2013-04-05 20:12:18

0

另一个原因我发现对于类似的错误是,当我们的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; } 
相关问题