0

我试图反序列化一个Json字符串。我的反序列化操作可以达到OrderData。 当我反序列化OrderData总是nullSourceData也没有显示出来。它也不会引发任何错误。任何建议来解决这个问题?DataContractJsonSerializer去反序列化Json

string jsonString = @" 
     { 
      ""RequestId"":514106, 
      ""Warning"":[], 
      ""CustomerData"": { 
       ""Email"":""[email protected]"", 
       ""FullName"":""OrTguOfE"", 
       ""OrderData"":[{ 
        ""OrderId"":""123"", 
        ""SourceId"":""0"", 
        ""SourceData"": [{ 
         ""SourceDescription"":""This is sourcedesc"", 
         ""ProductName"":""xyzabc"" 
        }] 
       }] 
      } 
     }"; 

我反序列化的代码放在这里:

RecordInfo records= Deserialize<RecordInfo>(jsonString); 
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); 
    } 
} 

下面是我用

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

回答

0

的问题与您的代码的datacontracts是,在你的JSON的OrderData成员的类型在CustomerData对象中是一个数组,但在你的类型定义中它是一个对象。同样,你的JSON中的SourceData是一个数组,但是在你的类型定义中是一个对象。

如果您更改了如下所示的类型定义,您应该能够使用DataContractJsonSerializer正确地反序列化它。

public class StackOverflow_15752476 
{ 
    const string jsonString = @" 
     { 
      ""RequestId"":514106, 
      ""Warning"":[], 
      ""CustomerData"": { 
       ""Email"":""[email protected]"", 
       ""FullName"":""OrTguOfE"", 
       ""OrderData"":[{ 
        ""OrderId"":""123"", 
        ""SourceId"":""0"", 
        ""SourceData"": [{ 
         ""SourceDescription"":""This is sourcedesc"", 
         ""ProductName"":""xyzabc"" 
        }] 
       }] 
      } 
     }"; 

    public static void Test() 
    { 
     RecordInfo records = Deserialize<RecordInfo>(jsonString); 
     Console.WriteLine(records.CustomerData.OrderData.Length); 
     Console.WriteLine(records.CustomerData.OrderData[0].OrderId); 
     Console.WriteLine(records.CustomerData.OrderData[0].SourceId); 
     Console.WriteLine(records.CustomerData.OrderData[0].SourceData[0].ProductName); 
    } 

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

    [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; } 
    } 
} 
相关问题