仅返回 JSON 中的某些字段

  • 本文关键字:字段 返回 JSON c# json
  • 更新时间 :
  • 英文 :


我有一个 API 以 JSON 格式返回类的一些数据。有没有办法在 JSON 中只返回 C# 类的某些特定字段?

例如:

class Person {
public int Id{ get; set; }
public string Name { get; set; }
public string Family { get; set; }
public string Gender { get; set; }
}
Person myPerson = new Person();
var Json = (new
{
Person = myPerson
});  
return Request.CreateResponse(HttpStatusCode.OK, Json);

它返回 ID、姓名、家庭、性别。我只需要返回姓名和家庭。我想我可以创建一个对象并在该对象的类中添加我的特定字段并返回对象?

使用匿名类型?

return Request.CreateResponse(HttpStatusCode.OK, new {Name = person.Name; Family = person.Family});

您应该考虑应用 DRY 原则。 DRY原则不是"永远不要写代码两次",而是"每条知识都必须在系统中有一个单一的、明确的、权威的表示"。 这意味着您必须构建一个模型,该模型具有有意义的名称,包含它实际具有的属性,并且可以在以后根据需要进行更改,而无需确定它在应用程序中的其他位置使用。我敢肯定,您还可以找到一个更能代表应用程序此区域的名称。

我应该只使用我需要的属性创建一个不同的模型,还是 使用相同的模型,并且我不使用的字段具有 NULL 值?或者只是创建匿名类型并在将来使这种方式更难?

根据我对它的理解,我不建议为您的情况使用相同的模型。如果你构建一个像我之前所说的那样有一个有意义的名称的模型,这将使你的生活更轻松。

那么我们应该怎么做呢?我见过很多人试图在域模型中使用 JsonIgnore ,但你不应该走这条路。应避免在域模型中使用 JsonIgnore 。我举个例子。

例如:

class Person {
public int Id { get; set; }
public string Name { get; set; }
public string Family { get; set; }
public string Gender { get; set; }
}

所以你有这个模型,你希望其他模型从它继承,但就像你的情况一样,你不想返回 Id 和性别,只返回名称和家庭。所以你这样去。

class Person {
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual string Family { get; set; }
public virtual string Gender { get; set; }
}
public class PersonNameModel : Person {
[JsonIgnore]
public override int Id { get; set; }
[JsonIgnore]
public override string Gender{ get; set; }
}

如果一个类有许多属性,而你只想序列化一个小的 它们的子集,然后将 JsonIgnore 添加到所有其他子集将是 繁琐且容易出错。处理这种情况的方法是添加 DataContractAttribute 到 class 和 DataMemberAttributes 到 要序列化的属性。这是选择加入序列化,只有 与选择退出相比,您标记的属性是序列化的 使用 JsonIgnoreAttribute 进行序列化。

但是,您可以在JsonIgnore 的帮助下执行此操作,但这种方式不支持 XML 格式。因此,如果您的应用程序必须更多地支持 XML 格式(或仅支持 XML(,而不是使用 Json.Net,您应该使用同时支持 JSON 和 XML 的 [DataContract]。 数据合同是一个很好的解决方案。它给了我一个干净的 REST API。同时,当我将数据保存在no-sql中时,尽管对象存储为json,但忽略的属性仍会保留。

[DataContract]
public class Person {
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual string Family { get; set; }
public virtual string Gender { get; set; }
}
public class PersonNameModel : Person {
// included in JSON
[DataMember]
public override string Name { get; set; }
[DataMember]
public override string Family { get; set; }
// other inherited properties will be ignored
}

我还将提到另一种方法,因为还有更多(自定义联系人解析器,Web API 约定("应该序列化"(......

另一种方法是使用 JsonProperty 属性装饰您的 auto 属性,以便在该字段为 null 时跳过该字段的序列化。 例:

class Person {
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public int? Id { get; set; }
public string Name { get; set; }
public string Family { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Gender { get; set; }
}

祝您编码愉快!

最新更新