【问题标题】:Can I instruct Json.NET to deserialize, but not serialize, specific properties? [duplicate]我可以指示 Json.NET 反序列化而不是序列化特定属性吗? [复制]
【发布时间】:2023-04-07 04:37:01
【问题描述】:

我有一个 AngularJS + MVC 5 + Web API 2 应用程序,它允许用户在浏览器中管理对象集合,并在单击“保存”按钮时立即提交所有更改。进行更改时,将向 JavaScript 对象添加一个或多个属性:IsAdded、IsUpdated、IsRemoved。在服务器端检查属性以确定持久化模型时要执行的操作。

模型通过 Web API 使用 Json.NET 提供,基类是:

public class CollectionItemViewModel : ICollectionItem
{
    public bool IsAdded { get; set; }
    public bool IsUpdated { get; set; }
    public bool IsRemoved { get; set; }
}

这很好用,但给我的序列化 JSON 增加了麻烦。我可以选择不使用ShouldSerialize 序列化这三个属性,但这也会阻止它们反序列化。

public bool ShouldSerializeIsAdded()
{
    return false;
}

public bool ShouldSerializeIsUpdated()
{
    return false;
}

public bool ShouldSerializeIsRemoved()
{
    return false;
}

是否可以使用 Json.NET 反序列化但不能序列化特定属性?

【问题讨论】:

  • ShouldSerialize* 绝对不应该影响反序列化。你对此绝对确定吗?因为那将是一个重大错误

标签: c# json.net


【解决方案1】:

您应该能够只使用问题中所示的 ShouldSerialize* 方法。这些只会影响序列化,不会影响反序列化。

【讨论】:

  • 感谢现实检查。我发誓我已按照我对 Softlion 答案的评论中的描述进行了测试,但显然不够密切。反序列化按预期工作;该问题与我的应用无关且特定于我的应用。
【解决方案2】:

正确的属性是 JsonIgnore。

[JsonIgnore]
public int Id {get;set;}

此处提供源文档:

http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size

【讨论】:

  • 据我所知,JsonIgnore 也阻止了反序列化。我使用 Fiddler 进行了测试,以捕获 IsAdded = true 的示例 POST,然后在我的 IsAdded 属性上使用和不使用 JsonIgnore 重播相同的 POST。正如 Marc 断言的那样,它正确地反序列化为 true,ShouldSerializeIsAdded 返回 false 并且没有 JsonIgnore。添加 JsonIgnore 导致 IsAdded = false。
  • @Jared 确实如此,这将使该属性完全未使用 - 在反序列化期间也不会使用它。
猜你喜欢
  • 1970-01-01
  • 2017-03-21
  • 2021-05-26
  • 2021-01-27
  • 2011-12-30
  • 1970-01-01
  • 2020-06-08
相关资源
最近更新 更多