防止属性在Web API中被序列化

10 浏览
0 Comments

防止属性在Web API中被序列化

我使用MVC 4 web API和asp.net web forms 4.0构建一个rest API。它工作得很好:\n

[HttpGet]
public HttpResponseMessage Me(string hash)
{
    HttpResponseMessage httpResponseMessage;
    List somethings = ...
    httpResponseMessage = Request.CreateResponse(HttpStatusCode.OK, 
                                 new { result = true, somethings = somethings });
    return httpResponseMessage;
}

\n现在,我需要防止某些属性被序列化。我知道我可以使用LINQ对列表进行一些操作,只获取我需要的属性,通常这是一个好方法,但在当前场景下,something对象太复杂了,而且我需要在不同的方法中使用不同的一组属性,因此在运行时将每个要忽略的属性标记为更容易。\n有没有办法做到这一点?

0
0 Comments

问题的原因是希望在Web API中防止某些属性被序列化。解决方法是使用DataContactAttribute和DataMemberAttribute,通过将这些属性应用到类和成员上来指定哪些属性允许被序列化。

首先,在类上应用DataContactAttribute,然后在要被序列化的每个属性上应用DataMemberAttribute。这样,在序列化过程中只有带有DataMemberAttribute的属性才会被序列化,其他属性将被忽略。

下面是一个示例代码,演示了如何使用DataContactAttribute和DataMemberAttribute来控制属性的序列化:

[DataContract]
public class MyClass {
  [DataMember]
  public int Id { get; set;} // Serialized
  [DataMember]
  public string Name { get; set; } // Serialized
  public string DontExposeMe { get; set; } // Will not be serialized
}

使用这种"选择性序列化"的方法,可以明确地决定哪些属性会被序列化,从而更好地控制序列化过程。此外,这种方法还可以使模型类可以独立存在于一个项目中,而不需要为了序列化它们而依赖于其他库,如JSON.net。

有用户提到有需要根据不同的API调用来包含或排除属性的情况,对此的建议是根据具体需求,在每个API方法中使用不同的类来表示不同的数据,然后分别应用DataContactAttribute和DataMemberAttribute来控制序列化。

另一个用户提到在EF Core中使用这些属性配置时,每次进行数据库上下文脚手架生成时都会丢失这些配置,对此是否有解决方法。对此,可以尝试将这些属性配置放在一个局部类中,或者以编程方式进行设置,以避免在每次生成时丢失配置。

总之,通过使用DataContactAttribute和DataMemberAttribute,可以很容易地控制Web API中属性的序列化过程,并根据具体需求选择性地进行序列化。这种方法使得可以更好地控制序列化过程,并使模型类能够独立存在于不同的项目中,而不需要依赖于其他库。

0
0 Comments

问题的出现原因是在Web API中,当我们希望阻止某个属性被序列化时,可以使用[JsonIgnore]属性来阻止Json序列化器对该属性进行序列化,或者使用[IgnoreDataMember]属性来阻止默认的XML序列化器对该属性进行序列化。然而,在测试中发现,[IgnoreDataMember]属性同时阻止了XML和Json请求的序列化,因此建议使用[IgnoreDataMember]属性而不是给属性添加多个属性。这是更好的答案,它可以同时处理XML和JSON请求,只需要一个属性。

然而,遗憾的是,[IgnoreDataMember]属性似乎不能与延迟加载的EF 6代理对象(虚拟属性)一起使用。而[DataContract][DataMember]属性可以正常工作。所以解决方法是使用[DataContract][DataMember]属性来替代[IgnoreDataMember]属性。

0
0 Comments

问题: 防止属性在Web API中被序列化的原因以及解决方法

在ASP.NET Web API中,默认使用Json.Net作为格式化程序。如果应用程序只使用JSON作为数据格式,可以使用[JsonIgnore]来忽略属性的序列化。但是,这种方法不支持XML格式。因此,如果应用程序必须更多地支持XML格式(或仅支持XML),而不是使用Json.Net,应该使用[DataContract],它同时支持JSON和XML。为了更好地理解,可以阅读官方文章。JsonIgnor属性不支持XML响应的原因是什么?Datacontract是一个很好的解决方案。它为我提供了一个干净的REST API。同时,当我将数据保存在no-sql中时,尽管对象以JSON格式存储,但被忽略的属性仍然被持久化。JsonIgnore属性所在的命名空间是Newtonsoft.Json,需要JSON.Net-nuget包。另一方面,DataContract和DataMember属性需要System.Runtime.Serialization命名空间(如果缺少则需要引用)。对于我来说,主要问题是这些配置在每次EF Core中的dbcontext脚手架中都会消失,有没有解决这个问题的方法?这些属性可以在一个部分类中或者以编程方式设置吗?注意,对于新的System.Text.Json命名空间,JsonIgnore仍然可以正常工作,而不需要旧的Newtonsoft组件。如果要求输入但不希望输出的情况下,JsonIgnore不起作用,例如密码字段。

0