ja używam Json.NET do serializacji klasy do JSON.
Mam taką klasę:
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; }
}
Chcę dodać JsonIgnore()
atrybut do Test2List
właściwości tylko wtedy, gdy Test2List
jest null
. Jeśli nie jest zerowy, to chcę dołączyć to do mojego JSona.
JsonSerializerSettings
nie używać,JsonSerializer
ponieważ pokazywał błąd w ostatnimAlternatywne rozwiązanie wykorzystujące
JsonProperty
atrybut:Jak widać w tym dokumencie online .
źródło
[JsonObject]
, ale pamiętaj, że nazwa atrybutu jest inna. [zredagowana odpowiedź]Podobna do odpowiedzi @ sirthomas męska, JSON.NET szanuje również na
EmitDefaultValue
własność naDataMemberAttribute
:Może to być pożądane, jeśli już używasz
[DataContract]
i[DataMember]
w swoim rodzaju modelu i nie chcą, aby dodać atrybuty JSON.NET specyficzne.źródło
Możesz pisać:
[JsonProperty("property_name",DefaultValueHandling = DefaultValueHandling.Ignore)]
Dba również o nie serializowanie właściwości z wartościami domyślnymi (nie tylko zerowymi). Może być przydatny na przykład dla wyliczeń.
źródło
Możesz to zrobić, aby zignorować wszystkie wartości null w obiekcie, który szeregujesz, a żadne właściwości null nie pojawią się w JSON
źródło
Jak widać w tym linku na ich stronie (http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size.aspx) I obsługa za pomocą [Default ()] w celu określenia wartości domyślnych
Zaczerpnięte z linku
źródło
Dostosowanie do odpowiedzi @ Mrchief / @ amit, ale dla osób używających VB
Patrz: „Inicjatory obiektów: Typy nazwane i anonimowe (Visual Basic)”
https://msdn.microsoft.com/en-us/library/bb385125.aspx
źródło
W .Net Core jest to teraz znacznie łatwiejsze. W pliku startup.cs po prostu dodaj opcje json i tam możesz skonfigurować ustawienia.
źródło
Z Json.NET
Wynik będzie:
źródło
Z
System.Text.Json
i .NET Core 3.0 to zadziałało dla mnie:źródło
Aby nieco wyjaśnić bardzo pomocną odpowiedź GlennG (tłumaczenie składni z C # na VB.Net nie zawsze jest „oczywiste”), możesz również udekorować właściwości poszczególnych klas, aby zarządzać sposobem obsługi wartości zerowych. Jeśli to zrobisz, nie używaj globalnego JsonSerializerSettings z sugestii GlennG, w przeciwnym razie zastąpi to poszczególne dekoracje. Jest to przydatne, jeśli chcesz, aby pusty element pojawiał się w JSON, aby konsument nie musiał wykonywać żadnych specjalnych czynności. Jeśli na przykład konsument musi wiedzieć, że zestaw opcjonalnych elementów jest zwykle dostępny, ale obecnie jest pusty ... Dekoracja w deklaracji właściwości wygląda następująco:
W przypadku właściwości, których nie chcesz, aby pojawiały się w zmianie JSON : = NullValueHandling.Include to : = NullValueHandling.Ignore . Nawiasem mówiąc - odkryłem, że możesz dobrze udekorować właściwość zarówno dla serializacji XML, jak i JSON (po prostu umieść je obok siebie). Daje mi to możliwość wywoływania serializatora XML w dotnet lub serializatora NewtonSoft do woli - zarówno praca obok siebie, jak i moi klienci mają opcję pracy z XML lub JSON. To jest gładkie jak smark na klamce, ponieważ mam klientów, którzy wymagają obu!
źródło
Oto podobna opcja, ale daje inny wybór:
Następnie używam tego w ten sposób:
Różnica polega na tym, że:
JsonSerializerSettings
każde używane miejsce.źródło
źródło