Wpis z mikrobloga

Czy (a jeżeli tak - to jak?) da się wymusić by w #aspnet był używany Newtonsoftowy Deserializer zamiast domyślnego? Różnych podejść ze #stackoverflow próbowałem, ale niestety bez sukcesu ( ͡° ʖ̯ ͡°) Potrafię sobie ręcznie wyciągnąć content z requesta i go deserializować, ale chciałbym wykorzystać wbudowany mechanizm (czyli obiekt jest w parametrze akcji controllera), tylko żeby korzystał z Json.NET (w tym konkretnym przypadku zależy mi na atrybucie JsonProperty).

Próbowałem modyfikować GlobalConfiguration.Configuration.Formatters czy dokładać własne atrybuty do controllera, ale wciąż deserializuje po staremu..

#dotnet #csharp #programowanie
  • 15
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@bacteria: Można, tak jestem w stanie. Chodzi mi o to by obiekt był w parametrze akcji.
Przykład:

public ActionResult MojaAkcja(Foo foo)
{
Debug.WriteLine(foo.Bar); //tu chciałbym
  • Odpowiedz
@bacteria: W tej chwili sobie radzę tak (oczywiście też upraszam kod dla przykładu):

var foo = JsonConvert.DeserializeObject(content);
Przy założeniu, że sobie wcześniej zrzucę do content treść zapytania. Działa oczywiście ślicznie ( ͡° ͜ʖ ͡°)
  • Odpowiedz
@meetom: no ale jaki jest problem? Podpinasz newtonsofta do referencji i używasz go w backendzie. Tam gdzie byś używał domyślnej serializacji.
A z tym drugim body to może użyj Dictionary? Jak ci przychodzi inny parametr niż Bar (znaczy że przychodzi generyczny/nieokreślony) to lepiej Dictionary używać niż klasy
  • Odpowiedz
@meetom: nie wiem jak podmienic frameworkowa deserializacje na newtonsofta w tym przypadku ale jak mi wyjasnisz jaki ewentualnie jest tego plus to moze wieczorem przysiade i zobacze co sie da zrobic.
  • Odpowiedz
@pwn3r: Problemu nie ma. Chciałbym wiedzieć czy da się (a jeżeli tak - to jak) wymusić, żeby ASP.NET korzystał z Newtonsofta przy deserializacji a nie robił tego po swojemu ( ͡° ͜ʖ ͡°)
  • Odpowiedz
@bacteria: Plusem jest czytelność kodu i jego kompatybilność wstecz ( ͡° ͜ʖ ͡°)
Nie blokuje to niczego, ogarnąłem temat tym, że wywalam parametr z body, ręcznie deserializuję i działa (kilka linijek więcej i trochę mniej czytelnie, ale śmiga ładnie). Pytam z czystej ciekawości - bo byłem przekonany, że to kwestia dodania jakiegoś atrybutu czy wskazania odpowiedniej klasy, ale nie doszukałem się samodzielnie działającego rozwiązania w sensownym
  • Odpowiedz
Tam gdzie byś używał domyślnej serializacji


@pwn3r: Możliwe, że w powyższym tkwi niezrozumienie (zakładając, że miałeś na myśli deserializację, bo o niej mowa) ( ͡° ͜ʖ ͡°) Domyślnie - żadna nie była używana (jawnie), bo asp.net robi to pod spodem. Sam sobie z body wyciąga JSONa, deserializuje i w momencie gdy zaczyna się wywołanie akcji to w parametrze do niej przychodzi już wypełniony obiekt. Po pierwsze
  • Odpowiedz
Przeciez tak jak dziala teraz jest lepiej i czysciej...


@bacteria: No właśnie było do tej pory, kiedy pola z JSONa się pokrywały nazwą z polami z obiektu. Jeżeli się różnią, to z pomocą przychodzi atrybut JsonProperty, któremu wskaziję, że ta moja właściwość "OrderId" będzie w JSONie się nazywać "orderid_". No ale to jest atrybut z Newtonsoft.Json (który żeby było śmieszniej jest domyślnie dorzucany do ASP.NET),
  • Odpowiedz
@Priya: Dzięki, za chwilę przykład. Choć po szybkim rzucie oka nie wygląda mi to na zmuszenie ASP.NET do używania innego deserializera, ale fakt - może pomóc przy różnych nazwach parametrów ;)
  • Odpowiedz
@meetom: zły przykład wysłałem, ale generalnie tam możesz określić w jaki sposób dane z requesta będą sczytywane.
W ControllerContext.HttpContext znajduje się body requesta, które możesz wczytać do stringa i zdeserializować czym chcesz.
  • Odpowiedz