如何使用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; } }
我只想在Test2List
为null
,将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)”
为了对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)]