C# 用于反序列化Json的DataContractJsonSerializer

C# 用于反序列化Json的DataContractJsonSerializer,c#,json,deserialization,datacontract,datacontractjsonserializer,C#,Json,Deserialization,Datacontract,Datacontractjsonserializer,我正在尝试反序列化Json字符串。我的反序列化工作到OrderData。 当我反序列化时,OrderData总是null并且SourceData也不显示。它也没有抛出任何错误。有什么解决这个问题的建议吗 string jsonString = @" { ""RequestId"":514106, ""Warning"":[], ""CustomerData"": {

我正在尝试反序列化
Json
字符串。我的反序列化工作到
OrderData
。 当我反序列化时,
OrderData
总是
null
并且
SourceData
也不显示。它也没有抛出任何错误。有什么解决这个问题的建议吗

    string jsonString = @" 
        {
            ""RequestId"":514106,
            ""Warning"":[],
            ""CustomerData"": {
                ""Email"":""abc@abc.com"",
                ""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);
    }
}

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

如果更改如下所示的类型定义,则应该能够使用
DataContractJsonSerializer
对其进行正确的反序列化

public class StackOverflow_15752476
{
    const string jsonString = @" 
        {
            ""RequestId"":514106,
            ""Warning"":[],
            ""CustomerData"": {
                ""Email"":""abc@abc.com"",
                ""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; }
    }
}
公共类堆栈溢出\u 15752476
{
常量字符串jsonString=@”
{
“请求ID”:514106,
“警告”:[],
“客户数据”:{
“电子邮件”:abc@abc.com"",
“全名”:“OrTguOfE”,
“OrderData”:[{
“医嘱ID”:“123”,
源ID:“0”,
“源数据”:[{
“SourceDescription”“:”“这是sourcedesc”“,
“产品名称”:“xyzabc”
}]
}]
}
}";
公共静态无效测试()
{
RecordInfo records=反序列化(jsonString);
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);
}
私有静态T反序列化(字符串jsonString)
{
使用(var ms=newmemoryStream(Encoding.Unicode.GetBytes(jsonString)))
{
var serializer=newdatacontractjsonserializer(typeof(T));
return(T)serializer.ReadObject(ms);
}
}
[数据合同]
公共类记录信息
{
[DataMember(Name=“RequestId”)]
公共字符串RequestId{get;set;}
[DataMember(Name=“Warning”)]
公共字符串警告{get;set;}
[DataMember(Name=“CustomerData”)]
公共CustomerData CustomerData{get;set;}
}
[数据合同]
公共类客户数据
{
[DataMember(Name=“Email”)]
公共字符串RequestId{get;set;}
[DataMember(Name=“FullName”)]
公共字符串全名{get;set;}
[DataMember(Name=“OrderData”)]
public OrderData[]OrderData{get;set;}
}
[数据合同]
公共类OrderData
{
[DataMember(Name=“OrderId”)]
公共字符串OrderId{get;set;}
[DataMember(Name=“SourceId”)]
公共字符串SourceId{get;set;}
[DataMember(Name=“SourceData”)]
public SourceData[]SourceData{get;set;}
}
[数据合同]
公共类源数据
{
[DataMember(Name=“SourceDescription”)]
公共字符串SourceDescription{get;set;}
[DataMember(Name=“ProductName”)]
公共字符串ProductName{get;set;}
}
}
public class StackOverflow_15752476
{
    const string jsonString = @" 
        {
            ""RequestId"":514106,
            ""Warning"":[],
            ""CustomerData"": {
                ""Email"":""abc@abc.com"",
                ""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; }
    }
}