Wie erhalte ich WebAPI, um meinen JSON mit JsonProperty zu validieren (Required = Required.Always)?

8
%Vor%

Ergebnisse:

%Vor%

JsonPropertyAttribute wird eindeutig unterstützt, da ich den PropertyName festlegen und wirksam werden lassen kann. Allerdings würde ich erwarten, dass ModelState.IsValid für die ersten beiden Beispieleingaben falsch ist, weil der Parameter Required JsonProperty auf Always gesetzt wurde.

Wenn ich es einfach durch JsonConvert laufen lasse:

%Vor%

Während der Deserialisierung wird wie erwartet eine Ausnahme ausgelöst:

%Vor%     
Micah Zoltu 02.08.2014, 06:02
quelle

3 Antworten

2

Um das zu lösen, habe ich meinen eigenen JSON.NET MediaTypeFormatter erstellt. Mein Formatierer lässt zu, dass die JSON.NET-Deserialisierungs-Ausnahmen ausgeblendet werden, was dazu führt, dass die Ausnahmebedingungsinformationen an den Aufrufer zurückgegeben werden.

Hier ist der MediaTypeFormatter, den ich gebaut habe:

%Vor%

Um diesen Formatierer über den eingebauten zu verwenden, habe ich diese Zeile meiner WebApiConfig hinzugefügt:

%Vor%

Wenn Sie es an Index 0 einfügen, hat es Vorrang vor dem integrierten Formatierer. Wenn Sie möchten, können Sie den integrierten JSON-Formatierer entfernen.

In diesem Szenario ist ModelState immer gültig in der Aktion, weil eine Ausnahme an den Benutzer zurückgeworfen wird, bevor die Aktion jemals ausgelöst wird, wenn die Deserialisierung fehlschlägt. Es müsste noch mehr Arbeit geleistet werden, um die Aktion mit einem Null-Parameter FromBody auszuführen.

    
Micah Zoltu 03.08.2014, 07:02
quelle
4

Der Standardwert JsonMediaTypeFormatter macht nicht abhängig von der JsonProperty , um zu entscheiden, ob Modellfelder erforderlich sind oder nicht. Es beruht jedoch auf dem RequiredAttribute

Wenn Sie dies tun möchten, dann implementieren Sie eine neue IRequiredMemberSelector und setzen Sie es auf MediaTypeFormatter.RequiredMemberSelector .

In Ihrer Implementierung von IRequiredMemberSelector wird Ihnen ein MemberInfo übergeben. Sie können das verwenden, um zu bewerten, ob Modellmitglieder das Attribut JsonProperty haben und ob das erforderliche Flag gesetzt ist und schließlich true oder false zurückgibt. Diese wird in die Eigenschaft ModelState.IsValid propagiert (es wird jedoch nicht die JSON.NET-Fehlermeldung, sondern die DataAnnotations / WebApi-Fehlermeldung verwendet.

Wenn Sie dies tun, schlage ich vor, dass Sie auch das Standardverhalten beibehalten.

    
Marcel N. 02.08.2014 06:29
quelle
0

Wenn Sie nur JSON unterstützen möchten, können Sie dies tun:

%Vor%

Man könnte denken, dass die Web-API 400 BAD REQUEST (mit zusätzlichen Fehlerinformationen in JSON) automatisch zurückgibt, wenn Serialisierung / Validierung fehlschlägt, aber meh ... Es ist nicht so fortgeschritten, wie es aussieht.

    
Florian Winter 07.02.2017 16:10
quelle