我如何才能序列化一个特定的属性,但又防止其反序列化回POCO?是否可以使用属性装饰特定属性?
基本上,我正在寻找一个与ShouldSerialize *方法等效的反序列化方法。
我知道我可以编写一个自定义转换器,但是这样做似乎有点过头了。
编辑:
这里还有一些背景。这背后的原因是我的课看起来像:
public class Address : IAddress { /// <summary> /// Gets or sets the two character country code /// </summary> [JsonProperty("countryCode")] [Required] public string CountryCode { get; set; } /// <summary> /// Gets or sets the country code, and province or state code delimited by a vertical pipe: <c>US|MI</c> /// </summary> [JsonProperty("countryProvinceState")] public string CountryProvinceState { get { return string.Format("{0}|{1}", this.CountryCode, this.ProvinceState); } set { if (!string.IsNullOrWhiteSpace(value) && value.Contains("|")) { string[] valueParts = value.Split('|'); if (valueParts.Length == 2) { this.CountryCode = valueParts[0]; this.ProvinceState = valueParts[1]; } } } } [JsonProperty("provinceState")] [Required] public string ProvinceState { get; set; } }
我需要CountryProvinceState请求的属性,但是我不希望它反序列化并触发设置程序逻辑。
CountryProvinceState
最简单的方法是将real属性标记为,[JsonIgnore]并创建一个get- only代理属性:
[JsonIgnore]
/// <summary> /// Gets or sets the country code, and province or state code delimited by a vertical pipe: <c>US|MI</c> /// </summary> [JsonIgnore] public string CountryProvinceState { get { return string.Format("{0}|{1}", this.CountryCode, this.ProvinceState); } set { if (!string.IsNullOrWhiteSpace(value) && value.Contains("|")) { string[] valueParts = value.Split('|'); if (valueParts.Length == 2) { this.CountryCode = valueParts[0]; this.ProvinceState = valueParts[1]; } } } } [JsonProperty("countryProvinceState")] string ReadCountryProvinceState { get { return CountryProvinceState; } }
如果需要,代理属性可以是私有的。
更新资料
如果必须对许多类中的许多属性执行此操作,则可能会更容易创建自己的ContractResolver检查自定义属性的属性。如果找到,则该属性将表示该属性为仅获取:
ContractResolver
[System.AttributeUsage(System.AttributeTargets.Property, AllowMultiple = false)] public class GetOnlyJsonPropertyAttribute : Attribute { } public class GetOnlyContractResolver : DefaultContractResolver { protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { var property = base.CreateProperty(member, memberSerialization); if (property != null && property.Writable) { var attributes = property.AttributeProvider.GetAttributes(typeof(GetOnlyJsonPropertyAttribute), true); if (attributes != null && attributes.Count > 0) property.Writable = false; } return property; } }
然后像这样使用它:
[JsonProperty("countryProvinceState")] [GetOnlyJsonProperty] public string CountryProvinceState { get; set; }
然后:
var settings = new JsonSerializerSettings { ContractResolver = new GetOnlyContractResolver() }; var address = JsonConvert.DeserializeObject<Address>(jsonString, settings);