在Json.Net中序列化属性,但不要反序列化属性

虽然我已经找到了许多方法来反序列化特定属性,同时又防止它们序列化,但我正在寻找相反的行为。

我发现了很多反问题:

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

我可以指示Json.NET反序列化(而不是序列化)特定属性吗?

JSON.Net-

仅在序列化时使用JsonIgnoreAttribute(但在反序列化时不使用)

我如何才能序列化一个特定的属性,但又防止其反序列化回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用于请求的属性,但是我不希望它反序列化并触发设置程序逻辑。

回答:

最简单的方法是将real属性标记为,[JsonIgnore]并创建一个get-

only代理属性:

    /// <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用于检查自定义属性的属性可能会更容易。如果找到,则该属性将表示该属性为仅获取:

[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);

以上是 在Json.Net中序列化属性,但不要反序列化属性 的全部内容, 来源链接: utcz.com/qa/412180.html

回到顶部