簡體   English   中英

將相同的JsonProperty分配給類中的兩個屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM