I am trying to deserialize a Json
String. My Deserialization works up to OrderData
.
When I deserialize OrderData
is always null
and SourceData
also not showing up. It's not throwing any error either. Any suggestion to get this resolved?
string jsonString = @"
{
""RequestId"":514106,
""Warning"":[],
""CustomerData"": {
""Email"":""abc@abc.com"",
""FullName"":""OrTguOfE"",
""OrderData"":[{
""OrderId"":""123"",
""SourceId"":""0"",
""SourceData"": [{
""SourceDescription"":""This is sourcedesc"",
""ProductName"":""xyzabc""
}]
}]
}
}";
my deserialization code goes here:
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);
}
}
Here are the datacontracts I use
[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; }
}
The problem with your code is that in your JSON, the type of the OrderData
member in the CustomerData
object is an array, but in your type definition it's an object. Likewise, The SourceData
in your JSON is an array, but in your type definition is an object.
If you change the type definitions as shown below, you should be able to deserialize it correctly with the 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; }
}
}