【发布时间】:2015-12-17 12:45:03
【问题描述】:
我有一个书面的 JsonHelper 类,它有两种方法 Serialized 和 Deserilized。当我尝试使用包含 2-3 个项目的主/详细信息模型时。它可以正常工作并转换反序列化的对象,但是当我尝试使用将要接收的真实数据时,我收到的详细信息集合(嵌套对象)始终为空。 我为我的服务创建了单元测试,它运行良好,因为我通过 C# 代码传递带有集合的对象。但是当我收到 Json 字符串中的 Android 帖子时。它返回给我的嵌套对象 OrderItemDetail 始终为空。我尝试了一切,但没有运气。
这是我的模型大师课
[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 个多小时来解决这个问题,请帮我解决我所缺少的问题。
【问题讨论】:
-
我删除了 [DataContract] 和 [DataMember] 属性,它工作正常。 :) 它对其他人的提示是,如果您要接收 JSON 字符串,请不要将 DataContract 或 DataMember 放在上面。
-
{"OrderItemDetail":[{"Notes":"Test Again","ItemId":1,"DiscountPerc":1.1,"DiscountAmount":1.1,"Quantity":1.1,"TotalPrice ":1.1,"UnitPrice":1.1}],"IsTakeAway":true,"NoOfPersons":1,"EmpId":1,"ResturantId":1,"StatusId":1,"TableId":1} 这是我从 Android 发布的对象。我不知道为什么它没有与我的代码映射
标签: c# json wcf serialization