[C#] json.net을 사용하여 null 인 경우 클래스의 속성을 무시하는 방법

Json.NET 을 사용하여 클래스를 JSON으로 직렬화하고 있습니다.

나는 이런 수업을 가지고있다 :

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

is 일 때만 JsonIgnore()속성에 Test2List속성 을 추가하고 싶습니다 . null이 아닌 경우 json에 포함시키고 싶습니다.Test2Listnull



답변

James Newton King에 따르면 : JavaScriptConvert를 사용하지 않고 직접 serializer를 만드는 경우 무시하도록 설정할 수 있는 NullValueHandling속성 이 있습니다.

샘플은 다음과 같습니다.

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

또는 @amit에서 제안한대로

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


답변

JsonProperty속성을 사용하는 대체 솔루션 :

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

// or for all properties in a class
[JsonObject(ItemNullValueHandling = NullValueHandling.Ignore)]

이 온라인 문서 에서 볼 수 있듯이 .


답변

@의 sirthomas의 대답과 마찬가지로, JSON.NET도 존중 특성 에를 :EmitDefaultValueDataMemberAttribute

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

이것은 당신이 이미 사용하는 경우 바람직 할 수 [DataContract][DataMember]모델 유형과 JSON.NET 특정 속성을 추가 할 수 없습니다.


답변

당신은 쓸 수 있습니다: [JsonProperty("property_name",DefaultValueHandling = DefaultValueHandling.Ignore)]

또한 속성을 기본값 (Null뿐만 아니라)으로 직렬화하지 않도록 처리합니다. 예를 들어 열거 형에 유용 할 수 있습니다.


답변

직렬화하는 객체의 모든 null을 무시하기 위해이 작업을 수행 할 수 있으며 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 기본값을 지정하기 위해 [Default ()] 사용 지원

링크에서 가져온

   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 ‘s / @amit의 답변에 적응하지만 VB를 사용하는 사람들에게 적합

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

“개체 이니셜 라이저 : 명명 된 익명 유형 (Visual Basic)”을 참조하십시오.

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