如何反序列化使用ContractResolver ResolvePropertyName编写的属性

时间:2014-04-01 11:48:33

标签: c# json.net

我正在尝试使用自定义的ContractResolver来编写节省空间的JSON序列化,该自定义的ContractResolver会覆盖ResolvePropertyName方法以生成更短的属性名称:

internal class MapContractResolver : DefaultContractResolver
{
    protected override string ResolvePropertyName(string propertyName)
    {
        return GetShortNameOf(propertyName);
    }
}

现在,我必须反过来反序列化。我有一个名为GetPropertyName(string shortName)的方法,但我不知道在哪里调用它。我可以覆盖一个合适的方法吗?

1 个答案:

答案 0 :(得分:3)

好。诀窍是不要覆盖ResolvePropertyName,而是覆盖CreateProperty,它被称为序列化和反序列化,如下所示:

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty jsonProperty = base.CreateProperty(member, memberSerialization);
        jsonProperty.PropertyName = GetShortNameOf(jsonProperty.PropertyName);
        return jsonProperty;
    }

注意:jsonProperty.UnderlyingName仍将保留完整的媒体资源名称。