如何使用json.net如果在null类中忽略一个属性

我正在使用Json.NET将一个类序列化为JSON。

我有这样的class级:

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

我只想在Test2Listnull ,将JsonIgnore()属性添加到Test2List属性。 如果它不是null,那么我想把它包含在我的json中。

按照James Newton King的NullValueHandling :如果您自己创build序列化程序而不是使用JavaScriptConvert,则可以设置NullValueHandling属性来忽略。

这是一个示例:

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

或者,如@amit所示

 JsonConvert.SerializeObject(myObject, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); 

使用JsonProperty属性的备用解决scheme:

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

正如在这个在线文档中看到的。

类似于@ sirthomas的答案,JSON.NET也尊重DataMemberAttribute上的EmitDefaultValue属性 :

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

如果您已经在模型types中使用[DataContract][DataMember] ,并且不想添加JSON.NET特定的属性,则这可能是可取的。

你可以这样做来忽略你正在序列化的对象中的所有空值,并且任何null属性都不会出现在JSON中

 JsonSerializerSettings settings = new JsonSerializerSettings(); settings.NullValueHandling = NullValueHandling.Ignore; var myJson = JsonConvert.SerializeObject(myObject, settings); 

在他们的网站上可以看到这个链接(http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size.aspx)I支持使用%5BDefault()%5D指定默认值;

从链接采取

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

适用于@ Mrchief的/ @ amit的答案,但对于使用VB的人来说

  Dim JSONOut As String = JsonConvert.SerializeObject( myContainerObject, New JsonSerializerSettings With { .NullValueHandling = NullValueHandling.Ignore } ) 

请参阅: “对象初始值设定项:命名和匿名types(Visual Basic)”

https://msdn.microsoft.com/en-us/library/bb385125.aspx

为了对GlennG非常有帮助的回答(从C#到VB.Net的语法并不总是“显而易见”)进行阐述,您还可以修饰各个类的属性来pipe理空值的处理方式。 如果你这样做,不要使用GlennGbuild议中的全局JsonSerializerSettings,否则会覆盖个别的装饰。 如果你想在JSON中出现一个空的项目,这个就派上用场了,所以用户不需要做任何特殊的处理。 例如,如果消费者需要知道可选项目的数组通常是可用的,但目前是空的…属性声明中的装饰看起来像这样:

 <JsonPropertyAttribute("MyProperty", DefaultValueHandling:=NullValueHandling.Include)> Public Property MyProperty As New List(of String) 

对于那些您不希望在JSON更改中出现的属性:= NullValueHandling.Include := NullValueHandling.Ignore 。 顺便说一句 – 我发现你可以装饰XML和JSON序列化的属性就好(只要把它们放在一起)。 这使我可以select在dotnet或NewtonSoft序列化程序中随意调用XML序列化程序 – 两者并行工作,我的客户可以select使用XML或JSON。 由于我有需要两个客户的客户,所以这是光滑的门把手,

你可以写: [JsonProperty("property_name",DefaultValueHandling = DefaultValueHandling.Ignore)]