Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#(WCF)服务中的嵌套JSON对象反序列化_C#_Json_Wcf_Serialization - Fatal编程技术网

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

C#(WCF)服务中的嵌套JSON对象反序列化,c#,json,wcf,serialization,C#,Json,Wcf,Serialization,我编写了一个JsonHelper类,其中有两个方法被序列化和反序列化。当我尝试使用带有2-3个项目的主/详细模型时。它可以很好地转换反序列化对象,但是当我尝试使用我将要接收的真实数据时,我接收的细节集合(嵌套对象)总是空的。 我已经为我的服务创建了单元测试,它工作得很好,因为我通过C#代码传递带有集合的对象。但当我收到一个Json字符串中的Android帖子时。它返回嵌套对象OrderItemDetail始终为空。我什么都试过了,但运气不好 这是我的模型大师班 [DataContract]

我编写了一个JsonHelper类,其中有两个方法被序列化和反序列化。当我尝试使用带有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; }
    }
我从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; }
}