C#JSON.NET如何在反序列化而不是序列化中忽略属性

C#JSON.NET如何在反序列化而不是序列化中忽略属性,c#,json,json.net,C#,Json,Json.net,我将一个对象序列化为JSON,然后反序列化回来 其中一个属性的结构已更改,现在反序列化崩溃,因此我现在需要忽略反序列化该属性 我可以使用[JsonIgnore,JsonProperty(Required=Required.Default)]完全忽略属性,但这也会忽略序列化中的属性-它需要保留,这样就不会丢失任何数据,即使它现在还没有被序列化。这里有一个答案,尽管它有点旧:但是,在我看来,这仍然是可行的,我不知道有更好的/不同的方法来做这件事。这个答案建议使用JsonIgnore标记不动产,并创建

我将一个对象序列化为JSON,然后反序列化回来

其中一个属性的结构已更改,现在反序列化崩溃,因此我现在需要忽略反序列化该属性


我可以使用
[JsonIgnore,JsonProperty(Required=Required.Default)]
完全忽略属性,但这也会忽略序列化中的属性-它需要保留,这样就不会丢失任何数据,即使它现在还没有被序列化。

这里有一个答案,尽管它有点旧:但是,在我看来,这仍然是可行的,我不知道有更好的/不同的方法来做这件事。这个答案建议使用JsonIgnore标记不动产,并创建一个“仅获取代理属性”


然后,如果您需要为许多属性创建自定义ContractResolver(也称为可重用解决方案)。

这里有一个答案,尽管它有点陈旧:但是,对我来说,它仍然是可行的,我不知道有更好/不同的方法来实现它。这个答案建议使用JsonIgnore标记不动产,并创建一个“仅获取代理属性”


然后,如果您需要为许多属性创建自定义ContractResolver(也称为可重用解决方案)。

您可以从JObject中序列化和反序列化,如从Amadeu Antunes中所述,尽管此解决方案相当不雅观,因为突然之间您将松散的键入抛到了混合中


另一个可能更容易的可能性是,如果您可以访问所有要反序列化的json对象,您可以在notepad++、SSM或其他任何程序中进行批量更新,只需在json文件中添加一些默认值。

您可以从JObject序列化和反序列化,就像从Amadeu Antunes,虽然这个解决方案相当不雅观,但突然之间你就把松散的打字加入了混合


另一个可能更容易的可能性是,如果您可以访问所有从中进行反序列化的json对象,则可以在notepad++中进行批量更新,ssms或任何东西,只需在json文件中添加一些默认值。

您可以使用JsonContractResolver来设置属性,如Newtonsoft.json的

比如说,

public class ShouldDeserializeContractResolver : DefaultContractResolver
{
    public static new readonly ShouldDeserializeContractResolver Instance = new ShouldDeserializeContractResolver();

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty property = base.CreateProperty(member, memberSerialization);

        MethodInfo shouldDeserializeMethodInfo = member.DeclaringType.GetMethod("ShouldDeserialize" + member.Name);

        if (shouldDeserializeMethodInfo != null)
        {
            property.ShouldDeserialize = o => { return (bool)shouldDeserializeMethodInfo.Invoke(o, null); };
        }

        return property;
    }
}
示例代码

var instance = new RootObject { ID = 2, DisplayName = "John Doe" };
var json = JsonConvert.SerializeObject(instance);
var settings = new JsonSerializerSettings
{
  ContractResolver = ShouldDeserializeContractResolver.Instance
};
Console.WriteLine(json);

var deserializedInstance = JsonConvert.DeserializeObject<RootObject>(json, settings);
Console.WriteLine($"Deserialized => Id={deserializedInstance.ID}, Name={deserializedInstance.DisplayName} ");
输出

{"ID":2,"DisplayName":"John Doe"}  //During Serialization
Deserialized => Id=2, Name=        // During Deserialization  

您可以使用JsonContractResolver来设置属性,如Newtonsoft.Json的

比如说,

public class ShouldDeserializeContractResolver : DefaultContractResolver
{
    public static new readonly ShouldDeserializeContractResolver Instance = new ShouldDeserializeContractResolver();

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty property = base.CreateProperty(member, memberSerialization);

        MethodInfo shouldDeserializeMethodInfo = member.DeclaringType.GetMethod("ShouldDeserialize" + member.Name);

        if (shouldDeserializeMethodInfo != null)
        {
            property.ShouldDeserialize = o => { return (bool)shouldDeserializeMethodInfo.Invoke(o, null); };
        }

        return property;
    }
}
示例代码

var instance = new RootObject { ID = 2, DisplayName = "John Doe" };
var json = JsonConvert.SerializeObject(instance);
var settings = new JsonSerializerSettings
{
  ContractResolver = ShouldDeserializeContractResolver.Instance
};
Console.WriteLine(json);

var deserializedInstance = JsonConvert.DeserializeObject<RootObject>(json, settings);
Console.WriteLine($"Deserialized => Id={deserializedInstance.ID}, Name={deserializedInstance.DisplayName} ");
输出

{"ID":2,"DisplayName":"John Doe"}  //During Serialization
Deserialized => Id=2, Name=        // During Deserialization  

@从标题来看,我认为这是完整的opposite@AmadeuAntunes从标题上看,我认为这是完全相反的。嘿,马特,这是一个很好的建议,我正在研究定制合同解析器now@moffin您是否不希望最终能够从json反序列化您的属性?如果是这样的话,这里看起来更像是您希望有一种从json中分配数据的方法,如果它存在,则忽略它。这个功能似乎并不是通过一个具有可访问属性的被忽略属性来实现的getter@Jack我想忽略数据,即使它存在。特定字段已从字符串更改为对象,我现在只想忽略加载它,同时仍然保存它。这里有一个很好的建议,我正在研究自定义ContractResolvernow@moffin您是否不希望最终能够从json反序列化您的属性?如果是这样的话,这里看起来更像是您希望有一种从json中分配数据的方法,如果它存在,则忽略它。这个功能似乎并不是通过一个具有可访问属性的被忽略属性来实现的getter@Jack我想忽略数据,即使它存在。特定字段已从字符串更改为对象,我现在只想在保存它的同时忽略加载它