使用json.net对对象属性进行条件序列化/反序列化

戴维·布拉本特

我有一个场景,其类定义如下:

class MyObject
{
    public DataDictionary MyObjectData { get; set; }

    public bool ShouldSerializeMyObjectData() { return true; }
    public bool ShouldDeserializeMyObjectData() { return false; }
}

当我尝试使用JSON.net对该类进行序列化/反序列化时,它会考虑ShouldSerialize,而不是ShouldDeserialize

根据文档,两者应该以我猜的相同方式工作。有什么特别的我应该知道的吗?更一般而言,我应该如何处理要序列化属性但不反序列化它的方案?

我正在使用,Json.NET 8.0如果那很重要。

谢谢你的帮助。

数据库

对于您的问题的简短回答是,即使自动检查,ShouldDeserialize{PropertyName}()当前也未实现ShouldSerialize{PropertyName}()接下来是更长的答案和解决方法。

JsonPropertyJson.NET在内部使用该类来定义有关如何将JSON属性映射到.NET成员或构造函数参数的协定。它具有两个谓词属性,ShouldSerialize并且ShouldDeserialize当它们为非null时,分别防止该属性被序列化和反序列化。初始化每个JsonProperty任务是的工作ContractResolver对于每个属性{PropertyName},Json.NET的默认合同解析器都会自动检查public bool ShouldSerialize{PropertyName}()方法的存在如果存在这样的方法,它将在ShouldSerialize谓词中添加对它的调用,从而在该方法返回时抑制序列化false之所以这样实现,是因为通过一种方法控制属性序列化ShouldSerialize{PropertyName}()是例如XmlSerializer有关更多背景信息,请参见相关的Json.NET发行说明

例如,在下面的类中,MyObjectData除非进行以下操作,否则将禁止序列化MyObjectData.Count > 0

class MyObject
{
    public DataDictionary MyObjectData { get; set; }

    public bool ShouldSerializeMyObjectData() { return MyObjectData != null && MyObjectData.Count > 0; }
}

JsonProperty.ShouldDeserialize但是,默认契约解析程序永远不会设置它这可能是由于没有反序列化的标准模式等价的事实,ShouldSerialize{PropertyName}()因此Newtonsoft从来没有任何实现这种模式的请求。但是,您已经注意到,存在支持这种模式的基础结构,因此应用程序可以创建实现此目的的自定义合同解析器实际上,Json.NET在其自己的测试套件中有一个此类合同解析器的示例

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;
    }
}

public class ShouldDeserializeTestClass
{
    [JsonExtensionData]
    public IDictionary<string, JToken> ExtensionData { get; set; }

    public bool HasName { get; set; }
    public string Name { get; set; }

    public bool ShouldDeserializeName()
    {
        return HasName;
    }
}

如果您想有条件地禁止属性反序列化(即使存在于JSON中),则可以考虑使用(和缓存)此协定解析器。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用无参数构造函数对对象进行序列化和反序列化

JSON反序列化对象-.NET

我是否必须使用WCF在Silverlight应用程序中对对象进行序列化/反序列化?

反序列化Json对对象的响应

JSON使用.NET DataContractJsonSerializer序列化器与字典进行序列化/反序列化

使用Json.NET对混合类型的数组进行序列化/反序列化

使用JSON.NET序列化/反序列化动态属性名称

使属性反序列化但不使用json.net序列化

使用JSON.net反序列化对象

使用JsonTypeInfo进行序列化/反序列化

Json.Net:序列化/反序列化属性作为值,而不是一个对象

序列化反序列化匿名子JSON属性以进行建模

Jackson:使用其他属性名称进行序列化/反序列化

如何使用 ByteArray 进行对象序列化和反序列化

ServiceStack使用对象对字典进行序列化和反序列化

使用原型对象进行序列化/反序列化

使用Json.NET对包含数字键的反序列化JSON进行反序列化

反序列化包含对象类型属性的 JSON

如何反序列化动态json属性以对象?

Json.Net序列化/反序列化类名称属性C#

序列化/反序列化嵌套的 POCO 属性而不在 json.net 中嵌套

C#JSON.net无法从文件反序列化和重新序列化对象

Json.Net 反序列化 JSON 对象

按属性反序列化JSON

动态json属性反序列化

反序列化以@ 开头的 JSON 属性

使用dart进行对象反序列化

反序列化复杂的JSON对象

Json反序列化对象错误