Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.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# c Json序列化必填字段_C#_Api_Serialization - Fatal编程技术网

C# c Json序列化必填字段

C# c Json序列化必填字段,c#,api,serialization,C#,Api,Serialization,我正在使用内置的DataContractJsonSerializer来准备传输数据 我使用以下代码从业务对象序列化: private string SerialiseRequest(RegistrationRequest request) { string strRequest = string.Empty; try { DataContractJsonSerializer

我正在使用内置的DataContractJsonSerializer来准备传输数据

我使用以下代码从业务对象序列化:

private string SerialiseRequest(RegistrationRequest request)
        {
            string strRequest = string.Empty;

            try
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(request.GetType());

                using (MemoryStream ms = new MemoryStream())
                {
                    serializer.WriteObject(ms, request);
                    strRequest = Encoding.Default.GetString(ms.ToArray());
                }
            }
            catch
            {
                return string.Empty;
            }

            return strRequest;
        }
当数据被序列化时,它似乎忽略了设置,最重要的设置是IsRequired,因为如果字段不包含数据,我不想传输它。下面是我如何定义业务对象的:

 [DataContract]
    public sealed class RegistrationRequest
    {
        [DataMember(Order = 0, IsRequired = true)]
        public Registration_Header registration_header { get; set; }

        [DataMember(Order = 1, IsRequired = true)]
        public Customer_Details primary_user { get; set; }

        [DataMember(Order = 2, IsRequired = true)]
        public StaffDetails partner_attributes { get; set; }

        [DataMember(Order = 3, IsRequired = true)]
        public CustomerAddress primary_residential_address { get; set; }      

        public class Registration_Header
        {
            [DataMember(Order = 0, IsRequired = true)]
            public string services_required { get; set; }

            [DataMember(Order = 1, IsRequired = true)]
            public string account_type { get; set; }

            [DataMember(Order = 2, IsRequired = true)]
            public string affiliate_number { get; set; }
        }

        public class Customer_Details
        {
            [DataMember(IsRequired = true)]
            public string title { get; set; }

            [DataMember(IsRequired = true)]
            public string first_name { get; set; }

            [DataMember(IsRequired = false)]
            public string middle_name { get; set; }

            [DataMember(IsRequired = true)]
            public string last_name { get; set; }

            [DataMember(IsRequired = true)]
            public string email { get; set; }

            [DataMember(IsRequired = true)]
            public string nationality { get; set; }

            [DataMember(IsRequired = true)]
            public string dob { get; set; }

            [DataMember(IsRequired = true)]
            public string occupation { get; set; }

            [DataMember(IsRequired = true)]
            public string residence_country { get; set; }

            [DataMember(IsRequired = true)]
            public string mobile_number { get; set; }

            [DataMember(IsRequired = false)]
            public string landline_number { get; set; }

            [DataMember(IsRequired = true)]
            public string source { get; set; }
        }

        public class StaffDetails
        {
            [DataMember(IsRequired = true)]
            public string reps_name { get; set; }

            [DataMember(IsRequired = true)]
            public string reps_location { get; set; }

            [DataMember(IsRequired = true)]
            public string customer_id { get; set; }
        }

        public class CustomerAddress
        {
            [DataMember(IsRequired = true)]
            public string postcode { get; set; }

            [DataMember(IsRequired = true)]
            public string street_or_address { get; set; }

            [DataMember(Name = "city", IsRequired = true)]
            public string city { get; set; }

            [DataMember(Name = "country", IsRequired = true)]
            public string country { get; set; }
        }
以下是我从“SerialiseRequest”方法返回的序列化数据示例:

{注册\头:{账户\类型:单一,附属\编号:A061535,需要的服务\转账}, 主要用户:{dob:23-10-1989,电子邮件:k@gale,名:凯西,座机号码:,姓:盖尔,中名:,手机号码:+44-79879879879,国籍:英国,职业:农民,住所:英国,来源:其他,职务:小姐}, 合作伙伴属性:{客户id:273098,代表位置:斯托克顿北 东英国,代表姓名:Richard Gale-551}, 主要居住地址:{城市:拉哈尔,国家:英国,邮政编码:ML9 2LS,街道或地址:1街道}


序列化程序只将序列化对象中的数据。它不会把装饰品带到课堂上。当DataContract发送回服务时,将触发IsRequired属性

您可以使用[DataMemberEmitDefaultValue=false]


还请注意,您必须用[DataContract]修饰Customer_Details类,以使其生效。

在呈现的json中,哪个字段是必填字段且为空?请尝试…捕获…返回字符串.Empty。天哪@JhonatasKleinkauff不需要的两个字段是中间名称和固定电话号码。正如您在上面的输出中所看到的,它们包含在一个空字符串中,但如果没有数据,我希望它们匹配。@UweKeim,返回一个空字符串是否有问题?空字符串在编码的其他地方通过抛出异常来处理。@Richard.Gale当然这是个问题。你扔掉了所有有价值的错误信息。对我来说,这是异常处理的反模式。那么你是说这不是省略没有数据的字段的正确方法吗?啊!请原谅。我错过了他说他不想传输没有数据的字段的部分。我认为埃里克有最好的答案。谢谢埃里克,我会试一试。它确实提出了一个问题,我真的需要为所有其他元素包含IsRequired=true吗?从中可以看出,在读取或反序列化时,它将被检查,并相应地抛出一个错误。这取决于你想对客户施加什么样的行为。另一个关于datacontracts的最佳实践--@Richard.Gale就个人而言,我不会使用IsRequired=true,除非我真的想强制执行这个属性。这意味着从JSON到C对象的每一次反序列化。我已更新以删除所有[IsRequired=true]设置,并将EmitDefaultValue=false放在中间的\u名称和固定电话\u编号上,但它们仍由序列化程序输出。有什么想法吗?那不应该发生。您能检查您正在序列化的对象是否实际具有middle\u name=null而不是middle\u name=。
[DataContract]
public sealed class RegistrationRequest
{
    [DataMember(Order = 0, IsRequired = true)]
    public Registration_Header registration_header { get; set; }

    [DataMember(Order = 1, IsRequired = true)]
    public Customer_Details primary_user { get; set; }

    [DataMember(Order = 2, IsRequired = true)]
    public StaffDetails partner_attributes { get; set; }

    [DataMember(Order = 3, IsRequired = true)]
    public CustomerAddress primary_residential_address { get; set; }

    public class Registration_Header
    {
        [DataMember(Order = 0, IsRequired = true)]
        public string services_required { get; set; }

        [DataMember(Order = 1, IsRequired = true)]
        public string account_type { get; set; }

        [DataMember(Order = 2, IsRequired = true)]
        public string affiliate_number { get; set; }
    }

    [DataContract]
    public class Customer_Details
    {
        [DataMember(IsRequired = true)]
        public string title { get; set; }

        [DataMember(IsRequired = true)]
        public string first_name { get; set; }

        [DataMember(EmitDefaultValue = false)]
        public string middle_name { get; set; }    

        [DataMember(IsRequired = true)]
        public string last_name { get; set; }

        [DataMember(IsRequired = true)]
        public string email { get; set; }

        [DataMember(IsRequired = true)]
        public string nationality { get; set; }

        [DataMember(IsRequired = true)]
        public string dob { get; set; }

        [DataMember(IsRequired = true)]
        public string occupation { get; set; }

        [DataMember(IsRequired = true)]
        public string residence_country { get; set; }

        [DataMember(IsRequired = true)]
        public string mobile_number { get; set; }

        [DataMember(EmitDefaultValue = false)]
        public string landline_number { get; set; }

        [DataMember(IsRequired = true)]
        public string source { get; set; }
    }

    public class StaffDetails
    {
        [DataMember(IsRequired = true)]
        public string reps_name { get; set; }

        [DataMember(IsRequired = true)]
        public string reps_location { get; set; }

        [DataMember(IsRequired = true)]
        public string customer_id { get; set; }
    }

    public class CustomerAddress
    {
        [DataMember(IsRequired = true)]
        public string postcode { get; set; }

        [DataMember(IsRequired = true)]
        public string street_or_address { get; set; }

        [DataMember(Name = "city", IsRequired = true)]
        public string city { get; set; }

        [DataMember(Name = "country", IsRequired = true)]
        public string country { get; set; }
    }
}