Programing

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

lottogame 2020. 2. 14. 21:56
반응형

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


GlennG의 매우 유용한 답변에 대해 간단히 설명하기 위해 (구문을 C #에서 VB.Net으로 변환하는 것이 항상 "분명하지는 않습니다") 개별 클래스 속성을 장식하여 null 값 처리 방법을 관리 할 수도 있습니다. 이 작업을 수행하는 경우 GlennG의 제안에서 글로벌 JsonSerializerSettings를 사용하지 않으면 개별 장식이 재정의됩니다. JSON에 null 항목을 표시하여 소비자가 특별한 처리를하지 않아도되는 경우에 유용합니다. 예를 들어 소비자가 옵션 품목의 배열이 일반적으로 사용 가능하지만 현재 비어 있음을 알아야하는 경우 ... 속성 선언의 장식은 다음과 같습니다.

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

이러한 속성을 위해 당신은 JSON 변화에 전혀 표시하고 싶지 않아요 = NullValueHandling.Include :: = NullValueHandling.Ignore . 그건 그렇고-XML과 JSON 직렬화에 대한 속성을 잘 꾸밀 수 있습니다 (서로 바로 옆에 두십시오). 이것은 닷넷으로 XML 시리얼 라이저를 호출하거나 NewtonSoft 시리얼 라이저를 마음대로 호출 할 수있는 옵션을 제공합니다. 나란히 작업하고 고객은 XML 또는 JSON으로 작업 할 수 있습니다. 둘 다 필요한 고객이 있기 때문에 손잡이에 코딱지가 붙어 있습니다!


비슷한 옵션이지만 다른 선택을 제공합니다.

public class DefaultJsonSerializer : JsonSerializerSettings
{
    public DefaultJsonSerializer()
    {
        NullValueHandling = NullValueHandling.Ignore;
    }
}

그런 다음 다음과 같이 사용합니다.

JsonConvert.SerializeObject(postObj, new DefaultJsonSerializer());

차이점은 다음과 같습니다.

  • JsonSerializerSettings사용되는 각 장소 를 인스턴스화하고 구성하여 반복되는 코드를 줄 입니다.
  • 직렬화 할 모든 개체의 모든 속성을 구성하는 시간을 절약합니다.
  • 재사용 가능한 객체에 속성을 명시 적으로 지정하지 않고 다른 개발자에게 직렬화 옵션에 유연성을 제공합니다.
  • 필자의 유스 케이스는 코드가 타사 라이브러리이며 클래스를 재사용하려는 개발자에게 직렬화 옵션을 강요하고 싶지 않다는 것입니다.
  • 잠재적 단점은 다른 개발자가 알아야 할 또 다른 객체이거나 응용 프로그램이 작고이 방법이 단일 직렬화에 중요하지 않다는 것입니다.

.Net Core에서는 이제 훨씬 쉽습니다. startup.cs에 json 옵션을 추가하면 해당 설정을 구성 할 수 있습니다.


public void ConfigureServices(IServiceCollection services)

....

services.AddMvc().AddJsonOptions(options =>
{
   options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;               
});


Json.NET으로

 public class Movie
 {
            public string Name { get; set; }
            public string Description { get; set; }
            public string Classification { get; set; }
            public string Studio { get; set; }
            public DateTime? ReleaseDate { get; set; }
            public List<string> ReleaseCountries { get; set; }
 }

 Movie movie = new Movie();
 movie.Name = "Bad Boys III";
 movie.Description = "It's no Bad Boys";

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

결과는 다음과 같습니다.

{
   "Name": "Bad Boys III",
   "Description": "It's no Bad Boys"
 }

var settings = new JsonSerializerSettings();
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
settings.NullValueHandling = NullValueHandling.Ignore;
//you can add multiple settings and then use it
var bodyAsJson = JsonConvert.SerializeObject(body, Formatting.Indented, settings);

참고 URL : https://stackoverflow.com/questions/6507889/how-to-ignore-a-property-in-class-if-null-using-json-net



반응형