可能有更好的答案,即从问题中退后一步,看看是否有完全不同的方法。特别是,为什么需要一个具有两个具有相同值的属性的类? 除了从 JSON 反序列化之外,该类的每个其他使用者都知道这两个属性需要保持同步吗?为什么?
但这回答了直接的问题。
[JsonProperty] 属性用于序列化和反序列化。如果您有两个具有相同 [JsonProperty] 属性的属性,那么当您将对象序列化为 JSON 时,您将拥有两个具有相同名称的属性。
您可以像这样创建自定义 JSON 序列化程序。如您所见,在反序列化 Example 后,它将使用 oldFavoriteColor 属性的值填充 favoriteColor 属性。
public class ExampleConverter : CustomCreationConverter<Example>
{
public override Example Create(Type objectType)
{
return new Example();
}
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
var result = (Example)base.ReadJson(reader, objectType, existingValue,
serializer);
result.favoriteColor = result.oldFavoriteColor;
return result;
}
}
为了使其工作,您还必须告诉序列化程序不要尝试反序列化 favoriteColor 属性。即使没有[JsonProperty] 属性,[JsonProperty(PropertyName = "favoriteColor")] 和另一个实际名为“favoriteColor”的属性之间仍然存在冲突。
public class Example
{
[JsonIgnore]
public string favoriteColor { get; set; }
[JsonProperty(PropertyName = "favoriteColor")]
public string oldFavoriteColor { get; set; }
}
要确认的单元测试:
public void DeserializerPopulatesFavoriteColorFromOldFavoriteColor()
{
var json = @"{ favoriteColor: ""Green""}";
var deserialized = JsonConvert.DeserializeObject<Example>(json, new ExampleConverter());
Assert.AreEqual("Green", deserialized.oldFavoriteColor);
Assert.AreEqual(deserialized.oldFavoriteColor, deserialized.favoriteColor);
}