2015-07-30 18 views
7

Diziselleştirilmelerini engellerken belirli özelliklerin serileştirilmesiyle ilgili birçok yaklaşım bulurken, karşıt davranışı arıyorum. Belirli bir özelliği seri, ancak geri deserializing önleyebilirsiniz nasılSerialize Özelliği, ancak Json.Net'te Özellik Deserialize Edilmiyor

Making a property deserialize but not serialize with json.net

Can I instruct Json.NET to deserialize, but not serialize, specific properties?

JSON.Net - Use JsonIgnoreAttribute only on serialization (But not when deserialzing)

: tersini soran sorulardan

buldum bol POCO? Belirli bir özelliği süslemek için kullanabileceğim bir özellik var mı?

Temel olarak, seri hale getirme için ShouldSerialize * yöntemlerine eşdeğer arıyorum.

Özel bir dönüştürücü yazabileceğimi biliyorum, ancak bunun için aşırı sıkıcı görünüyor.

Düzenleme: İşte

biraz daha bağlam var. Bunun gerekçesi benim sınıf gibi görünüyor:

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; } 
} 

Ben isteği için CountryProvinceState özelliği gerekir, ama geri serisini ve ayarlayıcı mantığı tetiklemek istemiyoruz.

+0

-özelleştirme olmadan standart bir şey? –

+0

Özel bir dönüştürücü sınıfı yazmak ve kaydetmek zorunda kalmadan davranışları değiştirmek istiyorum. Benzer şekilde, özel bir dönüştürücü sınıfı yazmak zorunda kalmadan bu durumun tersini işlemek için (öznitelikleri kullanarak veya ShouldSerialize * yöntemleri ekleme) birden çok seçenek vardır. –

+2

Görünüşe göre, bu soruyu şu andan itibaren keşfettiğim tek kişi ben değilim: http://stackoverflow.com/questions/31722033/json-net-webapi2-serialize-property-but-skip -sürüm-serileştirme –

cevap

12

En basit yöntem [JsonIgnore] olarak taşınmaz mal işaretlemek ve bir olsun-tek vekil özelliğini oluşturmak olacaktır: Eğer arzu

/// <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; } 
    } 

vekil mülkiyet özel olabilir.

Güncelleme

Eğer sınıfların sürü özelliklerinin sürü için bunu yapmak varsa, oluşturmak daha kolay olabilir sizin özel ayrıntı denetler kendi ContractResolver. bulduysanız, niteliği özellik olduğunu işaret olacağını sadece-get: Sonra

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

gibi kullanın: daha sonra

[JsonProperty("countryProvinceState")] 
[GetOnlyJsonProperty] 
public string CountryProvinceState { get; set; } 

Ve: Eğer olmayan bir yapmak istiyorum nasıl

 var settings = new JsonSerializerSettings { ContractResolver = new GetOnlyContractResolver() }; 

     var address = JsonConvert.DeserializeObject<Address>(jsonString, settings); 
+0

Güzel.Lemme testi yap ve bunu doğruladığımı onaylarım. Teşekkür ederim. –

+0

* Çok fazla özellik için bunu yapmanız gerekiyorsa, bir ['ContractResolver'] (http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Serialization_DefaultContractResolver.htm) oluşturmak için denetimi oldukça kolaydır. özel özellik. Ona ihtiyacı olmak? – dbc

+2

Test ettiğimde bir çekicilik gibi çalıştım. Dürüst olmak gerekirse bence bu, ama eğer sahipseniz, gelecekte insanlara fayda sağlayacağından eminim. Posterity, dünyaya hizmetiniz için teşekkür eder arkadaşım. –