103 votos

cómo ignorar una propiedad en la clase si es que el uso de null json.net?

Estoy usando Json.NET a serializar una clase a json. Tengo la clase como esta:

class Test1
{
    [JsonProperty("id")]
    public string ID { get; set; }
    [JsonProperty("label")]
    public string Label { get; set; }
    [JsonProperty("url")]
    public string URL { get; set; }
    [JsonProperty("item")]
    public List<Test2> Test2List { get; set; }
}

Quiero añadir un JsonIgnore() atributo Test2List de la propiedad sólo cuando Test2List es nulo. Si no es null, entonces quiero incluir en mi json.

175voto

sirthomas Puntos 928

Una solución alternativa, el uso de la JsonProperty atributo:

[JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
//or
[JsonProperty("property_name", NullValueHandling=NullValueHandling.Ignore)]

Como se ve en esta línea doc.

118voto

Mrchief Puntos 25418

Como por James Newton Rey: Si usted cree que el serializador de ti mismo en lugar de utilizar JavaScriptConvert hay un NullValueHandling de la propiedad que se puede establecer a ignorar.

He aquí una muestra:

JsonSerializer _jsonWriter = new JsonSerializer
            {
                NullValueHandling = NullValueHandling.Ignore
            };

11voto

Toby J Puntos 942

Similares a @sirthomas la respuesta, JSON.NET también respeta la EmitDefaultValue de la propiedad en DataMemberAttribute:

[DataMember(Name="property_name", EmitDefaultValue=false)]

Esto puede ser conveniente si usted ya está usando [DataContract] y [DataMember] en el tipo de modelo y no desea agregar JSON.NET-atributos específicos.

5voto

Mickey Perlstein Puntos 642

Como se puede ver en este enlace en su sitio (http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size.aspx) yo apoyo el uso de [Predeterminado()] para especificar los valores por defecto

Tomado del enlace

   public class Invoice
{
  public string Company { get; set; }
  public decimal Amount { get; set; }

  // false is default value of bool
  public bool Paid { get; set; }
  // null is default value of nullable
  public DateTime? PaidDate { get; set; }

  // customize default values
  [DefaultValue(30)]
  public int FollowUpDays { get; set; }
  [DefaultValue("")]
  public string FollowUpEmailAddress { get; set; }
}


Invoice invoice = new Invoice
{
  Company = "Acme Ltd.",
  Amount = 50.0m,
  Paid = false,
  FollowUpDays = 30,
  FollowUpEmailAddress = string.Empty,
  PaidDate = null
};

string included = JsonConvert.SerializeObject(invoice,
  Formatting.Indented,
  new JsonSerializerSettings { });

// {
//   "Company": "Acme Ltd.",
//   "Amount": 50.0,
//   "Paid": false,
//   "PaidDate": null,
//   "FollowUpDays": 30,
//   "FollowUpEmailAddress": ""
// }

string ignored = JsonConvert.SerializeObject(invoice,
  Formatting.Indented,
  new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore });

// {
//   "Company": "Acme Ltd.",
//   "Amount": 50.0
// }

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: