Opracowuję interfejs API w celu udostępnienia niektórych danych przy użyciu interfejsu API sieci Web ASP.NET.
W jednym z API klient chce, abyśmy ujawnili datę w yyyy-MM-dd
formacie. Nie chcę zmieniać ustawień globalnych (np. GlobalConfiguration.Configuration.Formatters.JsonFormatter
), Ponieważ jest to bardzo specyficzne dla tego klienta. I rozwijam to w rozwiązaniu dla wielu klientów.
Jednym z rozwiązań, które przychodzi mi do głowy, jest utworzenie niestandardowego, JsonConverter
a następnie umieszczenie go we właściwości, której potrzebuję, aby wykonać niestandardowe formatowanie
na przykład
class ReturnObjectA
{
[JsonConverter(typeof(CustomDateTimeConverter))]
public DateTime ReturnDate { get;set;}
}
Zastanawiam się tylko, czy istnieje inny łatwy sposób na zrobienie tego.
c#
datetime
asp.net-web-api
json.net
Zostać głupim
źródło
źródło
Odpowiedzi:
Jesteś na dobrej drodze. Ponieważ powiedziałeś, że nie możesz modyfikować ustawień globalnych, następną najlepszą rzeczą jest zastosowanie
JsonConverter
atrybutu w razie potrzeby, tak jak zasugerowałeś. Okazuje się, że Json.Net ma już wbudowaną funkcję,IsoDateTimeConverter
która pozwala określić format daty. Niestety nie możesz ustawić formatu za pomocąJsonConverter
atrybutu, ponieważ jedynym argumentem atrybutu jest typ. Jest jednak proste rozwiązanie: podklasę podklasyIsoDateTimeConverter
, a następnie określ format daty w konstruktorze podklasy. ZastosujJsonConverter
atrybut w razie potrzeby, określając swój niestandardowy konwerter i gotowe. Oto cały potrzebny kod:Jeśli nie masz nic przeciwko temu, by mieć tam czas, nie musisz nawet tworzyć podklasy IsoDateTimeConverter. Jego domyślny format daty to
yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK
(jak widać w kodzie źródłowym ).źródło
IsonDateTimeConverter
został pobrany bezpośrednio z kodu źródłowego Json.Net ; dlatego cofam twoją edycję w tej sprawie.Możesz użyć tego podejścia:
I użyj tego w ten sposób:
Ciąg DateTimeFormat używa składni ciągu formatu .NET opisanej tutaj: https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings
źródło
'JsonConverterAttribute' does not contain a constructor that takes 2 arguments
'JsonConverterAttribute' does not contain a constructor that takes 2 arguments
oznacza to, że Twoja wersja json.net jest za stara. Musisz zaktualizować do najnowszej wersji json.net.Można to również zrobić za pomocą
IsoDateTimeConverter
instancji, bez zmiany globalnych ustawień formatowania:Używa
JsonConvert.SerializeObject
przeciążenia, które przyjmujeparams JsonConverter[]
argument.źródło
Dostępne również przy użyciu jednego z przeciążeń ustawień serializatora:
Lub
Dostępne są również przeciążenia przyjmujące typ.
źródło
yyyy-MM-ddTHH:mm:ssZ
... 24-godzinny zegar na godziny.Zbuduj klasę pomocniczą i zastosuj ją do atrybutu właściwości
Klasa pomocnika:
Twój kod wygląda następująco:
źródło
Jest inne rozwiązanie, z którego korzystałem. Po prostu utwórz właściwość string i użyj jej dla json. Ta właściwość zwróci odpowiednio sformatowaną datę.
W ten sposób nie musisz tworzyć dodatkowych zajęć. Umożliwia także tworzenie różnych formatów danych. np. możesz łatwo utworzyć kolejną właściwość dla godziny przy użyciu tej samej daty i godziny.
źródło
Czasami dekorowanie atrybutu konwersji json nie zadziała, będzie to wynikać z wyjątku mówiącego, że „ 2010-10-01” jest prawidłową datą . Aby uniknąć tego typu, usunąłem atrybut json convert we właściwości i wspomniano o tym w metodzie deserilizedObject, jak poniżej.
źródło
Z poniższym konwerterem
Można go używać z domyślnym formatem niestandardowym
Lub jakikolwiek określony format właściwości
źródło