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个多小时来解决这个问题,请帮我修复我在上面缺少的东西。

C#(WCF)服务中的嵌套JSON对象反序列化

我使用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]标记。