使用带有 ItemRequired = Required.Always 的 Json.Net 反序列化时忽略属性

Posted

技术标签:

【中文标题】使用带有 ItemRequired = Required.Always 的 Json.Net 反序列化时忽略属性【英文标题】:Ignore a property when deserializing using Json.Net with ItemRequired = Required.Always 【发布时间】:2015-06-22 15:51:12 【问题描述】:

我正在使用 Json.Net 将类序列化和反序列化为 json 并返回。

我向标有[JsonObject(ItemRequired = Required.Always)](或Required.Always)的类添加了一个新的仅获取属性。这导致以下JsonSerializationException

Newtonsoft.Json.JsonSerializationException:在 JSON 中找不到必需的属性 '<PropertyName>'

我认为用JsonIgnore 标记该属性可以解决问题,但这不起作用。

我如何告诉 Json.Net 这个属性应该被忽略?

这是重现问题的最小示例:

[JsonObject(ItemRequired = Required.Always)]
public class Hamster

    public string FirstName  get; set; 
    public string LastName  get; set; 
    [JsonIgnore]
    public string FullName  get  return FirstName + LastName; 


private static void Main()

    var hamster = new Hamster FirstName = "Bar", LastName = "Arnon";
    var serializeObject = JsonConvert.SerializeObject(hamster);
    var deserializeObject = JsonConvert.DeserializeObject<Hamster>(serializeObject);

【问题讨论】:

【参考方案1】:

显然JsonIgnore 在这种情况下只会控制序列化。需要JsonIgnore 来指定FullName 属性不应序列化为json 表示形式。

要在反序列化期间忽略该属性,我们需要添加带有Required = Required.DefaultJsonProperty 注释(这意味着不需要)。

所以,这是避免JsonSerializationException的方法:

[JsonObject(ItemRequired = Required.Always)]
public class Hamster

    public string FirstName  get; set; 
    public string LastName  get; set; 
    [JsonIgnore]
    [JsonProperty(Required = Required.Default)]
    public string FullName  get  return FirstName + LastName; 

【讨论】:

为什么Json.Net(.net core 5)中没有JsonPropertyAttribute? @nAviD 有。刚检查。我假设您实际上并没有使用 Json.NET。

以上是关于使用带有 ItemRequired = Required.Always 的 Json.Net 反序列化时忽略属性的主要内容,如果未能解决你的问题,请参考以下文章

Cannot convert value of type ‘java.lang.String‘ to requi

Java.报错:The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from requi

将 TypeScript 枚举与猫鼬模式一起使用

将 TypeScript 枚举与猫鼬模式一起使用

config : 'option forwardfor' ignored for frontend 'openshift-api-server' as it requi

pkg_resources.DistributionNotFound: The 'pip==7.1.0' distribution was not found and is requi