C#(WCF)服务中的嵌套JSON对象反序列化
本文关键字:嵌套 JSON 对象 反序列化 WCF 服务 | 更新日期: 2023-09-27 18:27:14
我有一个编写的JsonHelper类,它有两个方法Serialized和Deserized。当我尝试2-3个项目的主/细节模型时。它工作得很好,可以转换消隐对象,但当我尝试使用我将要接收的真实数据时,我接收的细节集合(嵌套对象)总是为空。我已经为我的服务创建了单元测试,它运行良好,因为我通过C#代码传递带有集合的Object。但当我收到一个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; }
}
Json字符串,我从Android应用程序收到,我将其修改为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]
标记。