[英]Nested JSON Object deserialization in C# (WCF) service
我有一个书面的JsonHelper类,带有两个序列化和反序列化的方法。 当我尝试使用2-3个项目的Master / Detail模型时。 它可以正常工作并转换反序列化的对象,但是当我尝试使用将要接收的真实数据时,我接收到的详细信息集合(嵌套对象)始终为null。 我已经为我的服务创建了单元测试,它可以正常工作,因为我通过C#代码将带有集合的对象传递给了我。 但是当我收到Json字符串中的Android帖子时。 它返回我嵌套对象OrderItemDetail始终为null。 我尝试了一切,但没有运气。
这是我的模型大师班
[DataContract]
public class InitialOrder
{
[DataMember]
public int? ResturantId { get; set; }
[DataMember]
public int? EmpId { get; set; }
[DataMember]
public int? TableId { get; set; }
[DataMember]
public int? StatusId { get; set; }
[DataMember]
public bool? IsTakeAway { get; set; }
[DataMember]
public int? NoOfPersons { get; set; }
public Collection<OrderItemDetail> OrderItemDetails { get; set; }
}
这是我的OrderItemDetail类,可以是多个
[DataContract]
public class OrderItemDetail
{
[DataMember]
public int ItemId { get; set; }
[DataMember]
public decimal? UnitPrice { get; set; }
[DataMember]
public int? Quantity { get; set; }
[DataMember]
public decimal? TotalPrice { get; set; }
[DataMember]
public decimal? DiscountAmount { get; set; }
[DataMember]
public decimal? DiscountPerc { get; set; }
[DataMember]
public string Notes { get; set; }
}
从Android App收到的Json字符串,我将其修改为C#格式。
string jss = "{" +
"\"EmpId\": 1," +
"\"IsTakeAway\": true," +
"\"NoOfPersons\": 3," +
"\"ResturantId\": 1," +
"\"StatusId\": 2," +
"\"TableId\": 7," +
"\"OrderItemDetails\": [" +
"{" +
"\"ItemId\": 1," +
"\"Quantity\": 1," +
"\"UnitPrice\": 1.1," +
"\"DiscountAmount\": 1.0," +
"\"DiscountPerc\": 1.0," +
"\"TotalPrice\": 1.0," +
"\"Notes\": \"Test\"" +
"}," +
"{" +
"\"ItemId\": 1," +
"\"Quantity\": 1," +
"\"UnitPrice\": 1.1," +
"\"DiscountAmount\": 1.0," +
"\"DiscountPerc\": 1.0," +
"\"TotalPrice\": 1.0," +
"\"Notes\": \"Test\"" +
"}]" +
"}";
这是电话
InitialOrder initialOrder= JsonHelper.JsonDeserialize<InitialOrder>(jss);
它始终将OrderItemDetail返回为null。
这是我的JsonHelper类
public class JsonHelper
{
public static string JsonSerializer<T>(T t)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream();
ser.WriteObject(ms, t);
string jsonString = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
return jsonString;
}
/// <summary>
/// JSON Deserialization
/// </summary>
public static T JsonDeserialize<T>(string jsonString)
{
T obj = Activator.CreateInstance<T>();
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString));
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
obj = (T)serializer.ReadObject(ms);
ms.Close();
return obj;
}
}
我已经花了5个多小时解决此问题,请帮助我解决此问题。
我用json2csharp.com生成了类,区别仅在于数据类型
public class OrderItemDetail
{
public int ItemId { get; set; }
public int Quantity { get; set; }
public double UnitPrice { get; set; }
public double DiscountAmount { get; set; }
public double DiscountPerc { get; set; }
public double TotalPrice { get; set; }
public string Notes { get; set; }
}
public class RootObject
{
public int EmpId { get; set; }
public bool IsTakeAway { get; set; }
public int NoOfPersons { get; set; }
public int ResturantId { get; set; }
public int StatusId { get; set; }
public int TableId { get; set; }
public List<OrderItemDetail> OrderItemDetails { get; set; }
}
你可以试试看吗?
我没有发现任何其他问题
如果仍然不起作用,您可以发布变量jss
值吗?
我已经阅读了您的评论,但我认为您找到的解决方案没有解决真正的问题。 如果同时删除[DataContract]
和[DataMember]
标签,则默认情况下它将序列化所有公共字段和属性。 在原始代码清单中,您需要在Collection<OrderItemDetail>
对象上具有[DataMember]
标记。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.