我编写了一个可以从javascript调用的Web服务。这一切都运转良好,但我注意到还有比我预期更多的房产......
URL: http://localhost/intranet/Contacts.asmx/ContactsDirectory
简而言之,它从数据库中读取员工并将其添加到列表中。请注意,我只添加了13个可用属性中的5个:
foreach (DataRow row in ResultsDataTable.Rows)
{
var Employee = new Employees();
Employee.Firstname = row["FIRSTNAME"].ToString();
Employee.Surname = row["SURNAME"].ToString();
Employee.PostTitle = row["POST"].ToString();
Employee.Department = row["DEPTARTMENT"].ToString();
Employee.Email = row["EMAIL"].ToString();
employees.Add(Employee);
}
我的员工类有13个属性:
public class Employees
{
public string PersonRef;
public string Firstname;
public string Surname;
public string PrefName;
public string Telephone;
public string PostRef;
public string PostTitle;
public string Department;
public string Section;
public string Location;
public string Email;
public string Manager;
public string ManagersEmail;
}
我的AJAX请求:
xhr = $.ajax({
type: 'POST',
url: './intranet/Contacts.asmx/ContactsDirectory',
data: JSON.stringify({ Name: "Scott" }),
contentType: 'application/json; charset=utf-8',
dataType: 'json'
});
您可以从下面的响应中看到正在返回Properties Manager和ManagersEmail,但它们不在我的列表中!我该如何防止这种情况? 注意:我无法从我的类中删除任何属性,因为其他Web服务使用这些属性。
答案 0 :(得分:0)
不同之处在于您以不同格式“查询”数据。 JSON始终显示对象的所有属性,因为您定义了它们 - 无论值是什么,它们都是对象的一部分。您没有 设置 这一事实并未改变对象定义... 谢天谢地:)
然而,使用XML,我们有不同的标准。默认情况下,.NET序列化程序(根据XML规范)不包含具有NULL值的属性,您应该使用适当的XML属性明确定义它:https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute.isnullable(VS.85).aspx
此外,您可以参考关于在此处显示具有NULL值的元素的XML规范:https://www.w3.org/TR/xmlschema-1/#xsi_nil
答案 1 :(得分:0)
之所以出现差异是因为浏览器请求要求的响应格式与ajax请求不同。然而它实际上比那更微妙。它与两个序列化器之间功能不同的序列化设置有关。
JSON序列化程序设置设置为包含null属性,如果将其设置更改为省略null属性,则不会输出那些为null的字段。
您可以强制xml序列化程序在属性定义中使用属性来包含null属性。
无论如何,SO有很多关于如何让默认的json序列化器省略空值的答案。 here is one example
答案 2 :(得分:0)
如果序列化一个对象以通过json返回,那么即使它们为null,它也会占用该对象的所有属性。这是预期的行为,实际上有一个合理的原因(想想你想要知道属性为null的情况。)如果真的是一个问题,你有额外的属性,而不是创建一个只有的视图模型你想要的属性,然后选择你的数据,或者重构你的基类来处理。
答案 3 :(得分:0)
将[ScriptIgnore]属性添加到您不希望序列化为JSON的任何属性。
using System.Web.Script.Serialization;
public class Employees
{
public string PersonRef;
public string Firstname;
public string Surname;
public string PrefName;
public string Telephone;
public string PostRef;
public string PostTitle;
public string Department;
public string Section;
public string Location;
public string Email;
[ScriptIgnore]
public string Manager;
[ScriptIgnore]
public string ManagersEmail;
}
答案 4 :(得分:0)
如果您可以将服务切换到WCF,则可以使用EmitDefaultValue
[DataMember(EmitDefaultValue = false)]
public string Manager{ get; set; }
[DataMember(EmitDefaultValue = false)]
public string ManagerEmail{ get; set; }