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