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