【问题标题】:Nested JSON Object deserialization in C# (WCF) serviceC# (WCF) 服务中的嵌套 JSON 对象反序列化
【发布时间】: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


【解决方案1】:

我使用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] 属性,它工作正常。 :) 它对其他人的提示是,如果您要接收 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 发布并想用我的 WCF 方法映射的内容。但不幸的是,只有主字段可以正常工作,无法映射 OrderItemDetail 对象列表。
【解决方案2】:

我已阅读您的 cmets,但我认为您找到的解决方案错过了真正的问题。如果您同时删除 [DataContract][DataMember] 标记,则默认情况下它将序列化所有公共字段和属性。在您的原始代码清单中,您需要在 Collection&lt;OrderItemDetail&gt; 对象上添加 [DataMember] 标记。

【讨论】:

  • 谢谢詹姆斯,我仍然遇到同样的问题。我正在传递包含来自 Android 的嵌套对象的 JSON 对象。它只反序列化 MASTER 值而不是细节。两天以来,我的头非常猛烈。
  • {"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 发布并想用我的 WCF 方法映射的内容。但不幸的是,只有主字段可以正常工作,无法映射 OrderItemDetail 对象列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
相关资源
最近更新 更多