C#(WCF)服务中的嵌套JSON对象反序列化
我编写了一个JsonHelper类,其中有两个方法被序列化和反序列化。当我尝试使用带有2-3个项目的主/详细模型时。它可以很好地转换反序列化对象,但是当我尝试使用我将要接收的真实数据时,我接收的细节集合(嵌套对象)总是空的。 我已经为我的服务创建了单元测试,它工作得很好,因为我通过C#代码传递带有集合的对象。但当我收到一个Json字符串中的Android帖子时。它返回嵌套对象OrderItemDetail始终为空。我什么都试过了,但运气不好 这是我的模型大师班C#(WCF)服务中的嵌套JSON对象反序列化,c#,json,wcf,serialization,C#,Json,Wcf,Serialization,我编写了一个JsonHelper类,其中有两个方法被序列化和反序列化。当我尝试使用带有2-3个项目的主/详细模型时。它可以很好地转换反序列化对象,但是当我尝试使用我将要接收的真实数据时,我接收的细节集合(嵌套对象)总是空的。 我已经为我的服务创建了单元测试,它工作得很好,因为我通过C#代码传递带有集合的对象。但当我收到一个Json字符串中的Android帖子时。它返回嵌套对象OrderItemDetail始终为空。我什么都试过了,但运气不好 这是我的模型大师班 [DataContract]
[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; }
}
我从Android应用程序收到的Json字符串,我将其修改为C#格式
这是电话
InitialOrder initialOrder= JsonHelper.JsonDeserialize<InitialOrder>(jss);
InitialOrder InitialOrder=JsonHelper.JsonDeserialize(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;
}
}
public类JsonHelper
{
公共静态字符串JsonSerializer(T)
{
DataContractJsonSerializer ser=新的DataContractJsonSerializer(类型(T));
MemoryStream ms=新的MemoryStream();
ser.WriteObject(ms,t);
字符串jsonString=Encoding.UTF8.GetString(ms.ToArray());
Close女士();
返回jsonString;
}
///
///JSON反序列化
///
公共静态T JsonDeserialize(字符串jsonString)
{
T obj=Activator.CreateInstance();
MemoryStream ms=新的MemoryStream(Encoding.Unicode.GetBytes(jsonString));
DataContractJsonSerializer=新的DataContractJsonSerializer(obj.GetType());
obj=(T)serializer.ReadObject(ms);
Close女士();
返回obj;
}
}
我已经花了5个多小时来解决这个问题,请帮我修复我所缺少的问题。我生成了带有的类,区别仅在于数据类型
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; }
}
公共类OrderItemDetail
{
公共int ItemId{get;set;}
公共整数数量{get;set;}
公共双单价{get;set;}
公共双折扣装入{get;set;}
公共双折扣perc{get;set;}
公共双总价{get;set;}
公共字符串注释{get;set;}
}
公共类根对象
{
公共int EmpId{get;set;}
公共bool IsTakeAway{get;set;}
公共整数NoOfPersons{get;set;}
公共int ResturantId{get;set;}
public int StatusId{get;set;}
public int TableId{get;set;}
公共列表OrderItemDetails{get;set;}
}
你能试试吗
我没有发现任何其他问题
如果仍然不起作用,你能发布变量jss的值吗?我已经阅读了你的评论,但我认为你找到的解决方案忽略了真正的问题。如果同时删除
[DataContract]
和[DataMember]
标记,则默认情况下它将序列化所有公共字段和属性。在原始代码列表中,您需要在集合
对象上有[DataMember]
标记。我删除了[DataContract]和[DataMember]属性,它工作正常。:)这是给其他人的一个提示,如果你要接收一个JSON字符串,那么不要将DataContract或DataMember放在上面。{“OrderItemDetail”:[{“Notes”:“再次测试”,“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发布的对象。我不知道为什么它没有映射到我的代码。我删除了[DataContract]和[DataMember]属性,它工作正常。:)这是给其他人的一个提示,如果你要接收一个JSON字符串,那么不要将DataContract或DataMember放在上面。{“OrderItemDetail”:[{“Notes”:“再次测试”,“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上发布的内容,我想用我的WCF方法映射它。但不幸的是,只有主字段工作正常,无法映射OrderItemDetail对象列表。谢谢James,我仍然有同样的问题。我正在传递JSON对象,它包含来自Android的嵌套对象。它只反序列化主值,而不是详细信息。自从两天以来,我的头脑一直很紧张。{“OrderItemDetail”:[{“Notes”:“Test reach”,“ItemId”:1,“DiscountPerc”:1.1,“DiscountAmount”:1.1,“Quantity”:1.1,“TotalPrice”:1.1,“UnitPrice”:1.1}],“IsTakeAway”:true,“nooppersons”:1,“EmpId”:1,“ResturantId”:1,“StatusId”:1,“TableId”:1}这就是我在Android上发布的内容,我想用我的WCF方法映射它。但不幸的是,只有主字段工作正常,无法映射OrderItemDetail对象列表。
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;
}
}
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; }
}