JSON.NET JsonIgnore DeserializeObject

Posted

技术标签:

【中文标题】JSON.NET JsonIgnore DeserializeObject【英文标题】: 【发布时间】:2013-04-24 19:26:37 【问题描述】:

我使用 VS 2012 创建了一个 Web API。我有一个带有自定义对象参数的方法,我通过 Fiddler 将 JSON 传递给它进行测试:

[HttpPost, HttpPut] 公共 HttpResponseMessage UpsertProject(项目 p) ...

我的项目对象有大约十几个标记为 JsonIgnore 的属性。我的假设是,当我的对象被序列化为 Json 时,这些属性将被忽略......这是真的。但是,当我调试我的方法时,我注意到所有标有 JsonIgnore 的对象属性都设置为 null,即使我从 Fiddler 传入的 Json 正在设置它们。我还尝试将数据作为 Json 获取并将其反序列化为对象的新实例,但这也不会设置标记为 JsonIngore 的属性。我知道 JsonIgnore 可以用于序列化,但认为它不会阻止在反序列化时设置属性。令人沮丧的是,我知道 ScriptIgnore 的行为并非如此,但我想使用 JSON.net 来处理我的序列化/反序列化。我还创建了一个 Windows 应用程序并测试了相同的序列化/反序列化功能,并且它可以在其中工作。所以我想知道这是否是 JsonIgnore 属性的 Web API 限制?

【问题讨论】:

【参考方案1】:

如果它在 Windows 应用程序中以您想要的方式工作,但在 Web API 中却没有,则表明两者之间的 JSON 序列化程序设置不同。您在 Windows 应用程序中使用了哪些设置以使其正常工作?您可以采用这些设置并将它们应用于WebApiConfig 类的Register 方法中的Web API 序列化程序(在您的Web API 项目的App_Start 文件夹中)。例如:

JsonSerializerSettings jsonSettings = config.Formatters.JsonFormatter.SerializerSettings;
jsonSettings.NullValueHandling = NullValueHandling.Ignore;
jsonSettings.DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate;
...

编辑

好的,所以如果我理解正确,根据您最近的 cmets,您希望尽可能反序列化所有内容,但您只希望序列化两个特定属性,并且这些属性显然没有 null 或默认值。在这种情况下,您可以采取两种方法:

    在序列化之前将不希望序列化的属性设置为 null、零或 false(默认值)。因为您将DefaultValueHandling 设置为Ignore,这将导致这些属性不被序列化。

    在您的类中创建几个布尔 ShouldSerializeXXX() 方法,其中 XXX 是您不想序列化的每个属性的名称。这些方法应该返回false。示例见this question的第一个答案。

不要使用JsonIgnore,因为正如您所见,这将导致 Json.Net 完全忽略该属性,无论是用于序列化还是反序列化。

【讨论】:

嗨,布赖恩 - 感谢您的回复。我没有在 Windows 应用程序或 Web API 中设置任何特定的 JSON 序列化程序设置。不确定是否有任何我不知道的基础设置?更详细一点,我的代码包含在 API 控制器中,而不是 MVC API 控制器中,如果这很重要的话。由于这个问题,我基本上将 javascriptSerializer 与 ScriptIgnore 一起使用。它工作得很好,我想我只是希望将 Json.Net 用于我项目中的所有内容。让我知道我是否可以提供更多信息来帮助解决此问题。谢谢。 您的基类是ApiController 还是只是Controller?前者从 MVC 版本 4 开始默认使用 Json.Net,而后者使用 JavaScriptSerializer。 我的控制器的基类是 ApiController。 好的,那么它应该使用Json.Net。尝试从对象的属性中删除 JsonIgnore 属性,然后将我上面的答案中所示的设置添加到 MVC 项目中 WebApiConfig 类的 Register 方法中。 非常接近工作。我唯一的问题是我将 Json 中的一个值传递给我不想序列化的 API 方法。在我的测试中,这些值通过我的对象参数很好地进入我的方法,但我只想序列化两个对象属性。如果我将 JsonIgnore 添加到该属性,我会遇到与以前相同的问题,即对象的属性值未设置,为 NULL。

以上是关于JSON.NET JsonIgnore DeserializeObject的主要内容,如果未能解决你的问题,请参考以下文章

跨语言(python 到 scala)稀疏数据 ser/deser?

JSON.NET 将对象 序列化为 JSON字符串时,能否指定,某个属性不被转化。

@JsonIgnore

@JsonIgnore 和 @Getter 注解

注释@JsonIgnore的真正用途是啥

@JsonIgnore 和 @JsonIgnoreProperties 有啥区别