如何在 .GET 上忽略对象 属性 但在 .POST 上允许它?
How to ignore object property on .GET but allow it on .POST?
我的 c# web api 项目中有以下对象:
public class InfoUtente
{
public string nome { get; set; }
public string cognome { get; set; }
public string cellulare { get; set; }
public string email { get; set; }
public bool termini { get; set; }
public string fidelity { get; set; }
public InfoUtente() { }
public InfoUtente(string nome, string cognome, string cellulare, string email, string fidelity)
{
this.nome = nome;
this.cognome = cognome;
this.cellulare = cellulare;
this.email = email;
this.fidelity = fidelity;
}
}
当对服务器进行 .POST
调用时 InfoUtente
被发布,在这种情况下我应该 忽略 fidelity
属性 并允许 termini
而当用户使用 .GET
请求数据时,我应该 return 整个对象 fidelity
但没有 termini
.
我正在使用默认的序列化程序 (JSON.NET),并且我尝试在 termini
上使用 JsonIgnore
并在 .GET
中调用它 return是正确的 json 没有 termini
但是如果我尝试在 termini
[=60 上使用 JsonIgnore
制作 InfoUtente
的 .POST
=], 它也会在 .POST 中被忽略,并且它的值在任何情况下都会被设置为 false..
所以我应该可以 .POST
一个 JSON 和
nome,cognome,cellulare,email,termini
并能够 .GET
它与
nome,cognome,cellulare,email,fidelity
我是否应该制作两个不同的对象,一个带 termini
且不带 fidelity
以在 .POST
中使用,另一个不带 termini
且带 fidelity
以用于 .GET
或者我可以只使用一个对象来实现它?
创建两个不同的类确实是最好的解决方案。
您可能想看看 Data Transfer Objects,因为它们也旨在实现您想要做的事情。
除了您的 InfoUtente 实体之外,您还将拥有两个 类。一个用于获取有关您感兴趣的特定实例的信息:
public class InfoUtenteDto
{
public string nome { get; set; }
public string cognome { get; set; }
public string cellulare { get; set; }
public string email { get; set; }
public string fidelity { get; set; }
}
还有一个,用于创建新实例:
public class InfoUtenteForCreationDto
{
public string nome { get; set; }
public string cognome { get; set; }
public string cellulare { get; set; }
public string email { get; set; }
public bool termini { get; set; }
}
一种可能的方法是使用自定义合同解析器的两个接口 class。假设除了您的 class 我们还有
public interface InfoUtentePost
{
public string nome { get; set; }
public string cognome { get; set; }
public string cellulare { get; set; }
public string email { get; set; }
public bool termini { get; set; }
}
public interface InfoUtentGet
{
public string nome { get; set; }
public string cognome { get; set; }
public string cellulare { get; set; }
public string email { get; set; }
public string fidelity { get; set; }
}
让我们创建一个合约解析器
public class InterfaceContractResolver : DefaultContractResolver
{
private readonly Type _InterfaceType;
public InterfaceContractResolver(Type InterfaceType)
{
_InterfaceType = InterfaceType;
}
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
//IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);
IList<JsonProperty> properties = base.CreateProperties(_InterfaceType, memberSerialization);
return properties;
}
}
实际上就是这样。我们现在唯一要做的就是使用 JsonConvert.SerializeObject
和一些参数:
InfoUtentePost product = new InfoUtente();
var settings = new JsonSerializerSettings()
{
ContractResolver = new InterfaceContractResolver(typeof(InfoUtentePost))
};
string output = JsonConvert.SerializeObject(product, typeof(InfoUtentePost), settings);
// output = "{\"nome\":null,\"cognome\":null,\"cellulare\":null,\"email\":null,\"termini\":false}"
我的 c# web api 项目中有以下对象:
public class InfoUtente
{
public string nome { get; set; }
public string cognome { get; set; }
public string cellulare { get; set; }
public string email { get; set; }
public bool termini { get; set; }
public string fidelity { get; set; }
public InfoUtente() { }
public InfoUtente(string nome, string cognome, string cellulare, string email, string fidelity)
{
this.nome = nome;
this.cognome = cognome;
this.cellulare = cellulare;
this.email = email;
this.fidelity = fidelity;
}
}
当对服务器进行 .POST
调用时 InfoUtente
被发布,在这种情况下我应该 忽略 fidelity
属性 并允许 termini
而当用户使用 .GET
请求数据时,我应该 return 整个对象 fidelity
但没有 termini
.
我正在使用默认的序列化程序 (JSON.NET),并且我尝试在 termini
上使用 JsonIgnore
并在 .GET
中调用它 return是正确的 json 没有 termini
但是如果我尝试在 termini
[=60 上使用 JsonIgnore
制作 InfoUtente
的 .POST
=], 它也会在 .POST 中被忽略,并且它的值在任何情况下都会被设置为 false..
所以我应该可以 .POST
一个 JSON 和
nome,cognome,cellulare,email,termini
并能够 .GET
它与
nome,cognome,cellulare,email,fidelity
我是否应该制作两个不同的对象,一个带 termini
且不带 fidelity
以在 .POST
中使用,另一个不带 termini
且带 fidelity
以用于 .GET
或者我可以只使用一个对象来实现它?
创建两个不同的类确实是最好的解决方案。
您可能想看看 Data Transfer Objects,因为它们也旨在实现您想要做的事情。
除了您的 InfoUtente 实体之外,您还将拥有两个 类。一个用于获取有关您感兴趣的特定实例的信息:
public class InfoUtenteDto
{
public string nome { get; set; }
public string cognome { get; set; }
public string cellulare { get; set; }
public string email { get; set; }
public string fidelity { get; set; }
}
还有一个,用于创建新实例:
public class InfoUtenteForCreationDto
{
public string nome { get; set; }
public string cognome { get; set; }
public string cellulare { get; set; }
public string email { get; set; }
public bool termini { get; set; }
}
一种可能的方法是使用自定义合同解析器的两个接口 class。假设除了您的 class 我们还有
public interface InfoUtentePost
{
public string nome { get; set; }
public string cognome { get; set; }
public string cellulare { get; set; }
public string email { get; set; }
public bool termini { get; set; }
}
public interface InfoUtentGet
{
public string nome { get; set; }
public string cognome { get; set; }
public string cellulare { get; set; }
public string email { get; set; }
public string fidelity { get; set; }
}
让我们创建一个合约解析器
public class InterfaceContractResolver : DefaultContractResolver
{
private readonly Type _InterfaceType;
public InterfaceContractResolver(Type InterfaceType)
{
_InterfaceType = InterfaceType;
}
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
//IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);
IList<JsonProperty> properties = base.CreateProperties(_InterfaceType, memberSerialization);
return properties;
}
}
实际上就是这样。我们现在唯一要做的就是使用 JsonConvert.SerializeObject
和一些参数:
InfoUtentePost product = new InfoUtente();
var settings = new JsonSerializerSettings()
{
ContractResolver = new InterfaceContractResolver(typeof(InfoUtentePost))
};
string output = JsonConvert.SerializeObject(product, typeof(InfoUtentePost), settings);
// output = "{\"nome\":null,\"cognome\":null,\"cellulare\":null,\"email\":null,\"termini\":false}"