[英]Assign the same JsonProperty to two properties on class
從請求反序列化JSON屬性時,我想將其用於對象上的兩個不同屬性。 例如;
public class Example
{
[JsonProperty(PropertyName = "favoriteColor")]
public string favoriteColor { get; set; }
[JsonProperty(PropertyName = "favoriteColor")]
public string oldFavoriteColor { get; set; }
}
但是,這會導致錯誤:
名稱為“ favoriteColor”的成員已存在於“示例”中。 使用JsonPropertyAttribute指定另一個名稱。
如果這正是我的預期,該怎么辦?
我認為您可以修改其中一個屬性的set方法,以便無論何時設置,它也可以設置另一個屬性
例如
public class Example
{
[JsonProperty(PropertyName = "favoriteColor")]
public string favoriteColor {
get { return favoriteColor; } ;
set
{
favoriteColor = value;
if (oldFavoriteColor == null) {
oldFavoriteColor = value;
}
}
}
public string? oldFavoriteColor { get; set; }
}
可能有一個更好的答案,那就是退后一步,看看是否有完全不同的方法。 特別是為什么需要一個具有兩個具有相同值的屬性的類? 除了從JSON反序列化之外,此類的所有其他使用者是否都知道這兩個屬性需要保持同步,為什么?
但這回答了眼前的問題。
[JsonProperty]
屬性用於序列化和反序列化。 如果您具有兩個具有相同[JsonProperty]
屬性的屬性,那么在將該對象序列化為JSON時,您將擁有兩個具有相同名稱的屬性。
您可以像這樣創建自定義JSON序列化程序。 正如你所看到的,之后Example
進行反序列化,將填充favoriteColor
與價值屬性oldFavoriteColor
財產。
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.