2012-08-17 13 views
6

Próbuję serializować obiekty jako JSON z MVC4 WebAPI (RTM - właśnie zainstalowałem VS2012 RTM dzisiaj, ale miałem ten problem wczoraj w RC) i chciałbym wszystkie wartości null, które mają być renderowane w wyjściu JSON. Jak to:Nie mogę uczynić z WebApi MVC4 pól NULL w JSON

[{"Id": 1, "PropertyThatMightBeNull": null},{"Id":2, "PropertyThatMightBeNull": null}] 

ale co Im coraz to

[{"Id":1},{"Id":2}] 

Znalazłem ten Q/A WebApi doesnt serialize null fields ale odpowiedź albo nie działa na mnie albo ja braku uchwycić gdzie aby umieścić odpowiedź.

Oto co próbowałem:

  1. W Global.asax.cs za Application_Start, dodałem:

    var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
    json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include; 
    json.SerializerSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include; 
    

    nie (do) wydają błąd i rzeczywiście wydaje się wykonać w oparciu o spojrzenie na następną rzecz, którą próbowałem.

  2. W sposobie kontrolera (w podklasie ApiController) dodaje:

    base.Configuration.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include; 
    base.Configuration.Formatters.JsonFormatter.SerializerSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include; 
    

    powiedzieć 1 wykonany, ponieważ obie wartości w # 2 były już ustawione przed te linie ran jak przeszedł przez.

  3. W ruch desperacji (bo naprawdę nie chcemy ozdobić każdą właściwość każdego obiektu) Próbowałem dodanie tego attrib do nieruchomości, która była nieważna i nieobecny:

    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Include, 
        NullValueHandling = NullValueHandling.Include)] 
    

Wszystko trzy wytwarzają ten sam JSON z pominiętymi właściwościami pustymi.

Dodatkowe uwagi:

  • działa lokalnie w IIS (próbował zbudowany w zbyt), Windows 7 RTM VS2012.
  • Powrót do listy metod sterowania Lista wypróbowanych IEnumerable też
  • Obiekty, które próbuję serializować, to pocos.

Odpowiedz

1

końcu natknąłem się na to http://forums.asp.net/t/1824580.aspx/1?Serializing+to+JSON+Nullable+Date+gets+ommitted+using+Json+NET+and+Web+API+despite+specifying+NullValueHandling który opisuje to, czego doświadcza jako błąd w wersji beta, która była naprawione dla RTM.

Mimo że zainstalowałem VS2012 RTM, mój projekt wciąż korzystał z wszystkich pakietów nuget, z których pochodzi beta. Więc nugetowałem (nugot?) Aktualizacje dla wszystkiego i wszystko jest teraz dobrze (używająC# 1 z mojego pytania). Chociaż czuję się głupio, że spaliłem pół dnia.

10

To nie zadziała:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include; 

Ale to robi:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings() 
{ 
NullValueHandling = Newtonsoft.Json.NullValueHandling.Include 
}; 
+0

Okazuje się, że nie działa - czy powinien mieć. Opublikuję to, co robiłem, aby dać sobie pełną dawkę pokory :) – AndrewFreese

+0

Nie mogę ci wystarczająco podziękować za tę odpowiedź. – Simian

+0

Pierwszy wariant również działa (bez tworzenia nowej instancji ustawień serializera), o ile ustawisz zarówno DefaultValueHandling, jak i NullValueHandling na odpowiednie wartości Uwzględnij – Masterfu

0

Kiedy zobaczyłem tę odpowiedź, byłem zdenerwowany, ponieważ już to robiłem, ale mój problem nadal istniał.Mój problem polegał na tym, że mój obiekt zaimplementował interfejs, który zawierał typ zerowy, więc miałem umowę stwierdzającą, że jeśli chcesz mnie wdrożyć, musisz mieć jeden z nich, i serializator, mówiąc, że jeden z nich jest zerowy nie dołączaj tego. BUM!

2

Z jakiegoś dziwnego powodu Newtonsoft.Json.JsonFormatter zignoruje przypisania do właściwości SerializerSettings.

Aby praca ustawienie utworzyć nową instancję .SerializerSettings jak pokazano poniżej:

config.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings 
     { 

      DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include, 
      NullValueHandling = Newtonsoft.Json.NullValueHandling.Include, 

     }; 
+0

Działa to również bez tworzenia nowej instancji ustawień serializera, o ile ustawisz oba DefaultValueHandling i NullValueHandling do odpowiednich wartości Uwzględnij – Masterfu

+0

Utworzenie nowej instancji ustawień serializera było wymagane, aby rozwiązać ten problem dla nas na maszynach programistycznych i programistycznych. To był frustrujący problem, ponieważ nasze maszyny programistyczne działały zgodnie z oczekiwaniami, po prostu ustawiając odpowiednie wartości (z pozornie równymi wersjami serializatora .NET, json). –

Powiązane problemy